SOAP-клиент Objective-C - запросить проблему? - PullRequest
2 голосов
/ 31 августа 2011

Я сгенерировал код с WSDL2OBJC.У меня большая проблема с запросом в моем клиенте Objective C:

CatalogoPortBinding *binding = [[CatalogoSvc CatalogoPortBinding] initWithAddress:@"http://localhost:8080/WSServer/Catalogo_V1"];
    binding.logXMLInOut = YES;  // to get logging to the console.

    CatalogoSvc_hello *request = [[CatalogoSvc_hello alloc] init];

    NSString *t = @"David";
    request.name = t;

    NSLog(@"request: %@",request.name);

    CatalogoPortBindingResponse *response = [binding helloUsingParameters:request];


    //NSLog(@"%@",resp.bodyParts);
    for (id mine in response.bodyParts)
    {

        NSLog(@"name: %@",[mine return_]);
        if ([mine isKindOfClass:[CatalogoSvc_helloResponse class]])
        {   
            if (sec == YES) {

                //NSLog(@"name: %@",[mine return_]);
                NSString *texto = (NSString*)[mine return_];
                [lab setText:(NSString*)texto];
            }
        }

    }

моя консольная программа:

2011-08-31 12:29:05.086 Catalogo-V1[3596:207] request: David
2011-08-31 12:29:05.088 Catalogo-V1[3596:207] OutputHeaders:
{
    "Content-Length" = 434;
    "Content-Type" = "text/xml; charset=utf-8";
    Host = localhost;
    Soapaction = "";
    "User-Agent" = wsdl2objc;
}
2011-08-31 12:29:05.088 Catalogo-V1[3596:207] OutputBody:
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:CatalogoSvc="http://org/" xsl:version="1.0">
  <soap:Body>
    <CatalogoSvc:hello>
      <CatalogoSvc:name>David</CatalogoSvc:name>
    </CatalogoSvc:hello>
  </soap:Body>
</soap:Envelope>
2011-08-31 12:29:05.093 Catalogo-V1[3596:207] ResponseStatus: 200
2011-08-31 12:29:05.094 Catalogo-V1[3596:207] ResponseHeaders:
{
    "Content-Type" = "text/xml;charset=utf-8";
    Date = "Wed, 31 Aug 2011 10:29:05 GMT";
    Server = "GlassFish Server Open Source Edition 3.1.1";
    "Transfer-Encoding" = Identity;
    "X-Powered-By" = "Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Apple Inc./1.6)";
}
2011-08-31 12:29:05.094 Catalogo-V1[3596:207] ResponseBody:
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:helloResponse xmlns:ns2="http://org/"><return>Hello null !</return></ns2:helloResponse></S:Body></S:Envelope>
2011-08-31 12:29:05.095 Catalogo-V1[3596:207] name: Hello null !

Мне нужно показать это сообщение: "Привет, Дэвид!"и я получаю: «Привет, ноль!».

Ответы [ 2 ]

1 голос
/ 27 июля 2012

У меня была такая же проблема до предложения ниже ...

Согласно тому, что вы показали на своей консоли, сформулированный вами XML-запрос является недействительным. У вас есть

<ns2:hello xmlns:ns2="http://org/" />
    <name>david</name>
</ns2:hello>

Но вы должны иметь (обратите внимание на удаление недействительного завершения тега XML):

<ns2:hello xmlns:ns2="http://org/>
    <name>david</name>
</ns2:hello>

Также обратите внимание, что ваш рабочий пример запроса содержит элемент soap: Header, а ваш - нет. Это вряд ли проблема здесь.

0 голосов
/ 02 сентября 2011

На основании сравнения этого запроса с тем, что у вас есть в ваш вопрос о ручном решении , похоже, у вас здесь возникают проблемы с пространством имен. Сгенерированный здесь запрос SOAP применяет пространство имен http://org/ (через идентификатор CatalogoSvc) к элементу «name»:

<CatalogoSvc:hello>
  <CatalogoSvc:name>David</CatalogoSvc:name>
</CatalogoSvc:hello>

В ручном сценарии, где вы заставили это работать, пространство имен http://org/ применяется к окружающему элементу "привет", но не к элементу "имя":

<ns2:hello xmlns:ns2="http://org/>
    <name>david</name>
</ns2:hello>

Основываясь на этом наблюдении, я бы сделал вывод, что ваша служба не ожидает применения пространства имен к элементу имени, поэтому не находит этот параметр при отправке с пространством имен.

Чтобы решить эту проблему, вам необходимо:

  1. Выясните, как сообщить генерации заглушки клиента SOAP НЕ применять пространство имен к вашему параметру, или
  2. Обновите ваш сервис, чтобы он ожидал элемент name в пространстве имен.

Поскольку код на стороне клиента предположительно генерируется из WSDL службы, я подозреваю, что код Objective C делает это правильно, а код службы - неправильно, но это всего лишь подозрение. В любом случае вам нужно найти способ заставить клиента и сервер "согласиться"

...