2011-08-31 145 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元素,和你不。雖然這不太可能成爲問題。