我用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 !
我需要传达这样的信息:“你好大卫!”我收到:“Hello null!”。
答案 0 :(得分:1)
我有同样的问题,直到下面的建议......
根据您在控制台中显示的内容,您制定的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元素,而您的不包含。这不太可能是这里的问题。
答案 1 :(得分:0)
基于将此请求与your question posted about a manual solution中的请求进行比较,看起来您在这里发生了名称空间问题。此处生成的SOAP请求将http://org/命名空间(通过标识符CatalogoSvc)应用于“name”元素:
<CatalogoSvc:hello>
<CatalogoSvc:name>David</CatalogoSvc:name>
</CatalogoSvc:hello>
在手动方案中,您可以将http://org/命名空间应用于周围的“hello”元素,但不应用于“name”元素:
<ns2:hello xmlns:ns2="http://org/>
<name>david</name>
</ns2:hello>
根据这一观察结果,我推断出您的服务不期望将命名空间应用于name元素,因此当它与命名空间一起发送时,它不会找到该参数。
要解决此问题,您需要:
由于客户端代码可能是从服务的WSDL生成的,我怀疑Objective-C代码是正确的,你的服务代码有错,但这只是一种怀疑。无论哪种方式,您都需要找到一种方法使客户端和服务器端“同意”