2011-08-31 127 views
2

我用WSDL2OBJC生成了代码。 我有很大的问题,在我的目标C客户端请求:Objective-C SOAP客户端 - 请求问题?

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 ! 

我需要显示这样的信息:“你好!大卫”我收到:“你好null!”。

+0

我需要帮助.......我已经在Java中生成了很多不同的Web服务,结果是一样的,我知道问题出在了目标C SOAP客户端上。我已经展示了这个教程,并且我已经遵循了这个 - > http://myblack.net/showthread.php?399-iPhone-Development-Accessing-SOAP-Services-with-WSDL2ObjC – Davidin073

回答

0

基于将此请求与your question posted about a manual solution中的要求进行比较,看起来您已在此处发生命名空间问题。这里生成的SOAP请求应用http://org/命名空间(经由所述标识符CatalogoSvc)到“name”元素:

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

在手动情况下,你已经得到这个工作,http://org/命名空间被施加到周围“你好”元素,但不是‘name’元素:

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

基于这一观察,我推断你的服务不期待一个命名空间被应用到name元素,所以它没有发现参数时它与一个命名空间一起发送。

为了解决这个问题,你将需要:

  1. 图如何告诉SOAP客户端存根一代不是一个命名空间应用到您的参数,或
  2. 更新服务,使其期待名称空间的“名称”元素。

由于客户端代码大概是从服务的WSDL生成的,我怀疑Objective-C代码是正确的,你的服务代码有错误,但这只是一个怀疑。无论哪种方式,你需要找到一种方法,使客户端和服务器端的“同意”

+0

好的观察Tim但是wsdl2objc产生了更难的请求:<?xml version =“1.0”?> 大卫 并且在该部分:的xmlns:CatalogoSvc =” http:// org /“跟手动相同 – Davidin073

+0

对不起,这个肮脏的评论..并且谢谢你的回答!! – Davidin073

+0

但是如果你有时间,你可以测试我的情况,我只做了一个默认的web服务在使用Netbeans的web java应用程序中,测试了这个web服务并生成了wsdl2objc代码,最后通过简单的目标c应用程序,我完成了一个使用wsdl2objc代码的SOAP客户端(首先是这个问题)。 .... – Davidin073

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> 

还要注意的是你的工作样本请求包括肥皂:Header元素,和你不。虽然这不太可能成为问题。