2011-09-02 69 views
0

我有一个简单的Java Web服务:Objective C的SOAP请求使用Java Web服务

@WebService(serviceName = "Catalogo_V1") 
public class Catalogo_V1 { 

     /** This is a sample web service operation */ 
     @WebMethod(operationName = "hello") 
     public String hello(@WebParam(name = "name") String txt) 
     { 
      System.out.println("kkk"+txt); 
      if(txt != null) 
      { 
       txt= txt +"www"; 
      } 

      return "Hello " + txt + " !"; 
     } 

    } 

我做这个Web服务测试:(HTTP://本地主机:8080/WSServer/Catalogo_V1?测试仪)

方法返回

java.lang.String : "Hello davidwww !" 

SOAP Request 

<?xml version="1.0" encoding="UTF-8"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Header/> 
    <S:Body> 
     <ns2:hello xmlns:ns2="http://org/"> 
      <name>david</name> 
     </ns2:hello> 
    </S:Body> 
</S:Envelope> 

SOAP响应

<?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 davidwww !</return> 
     </ns2:helloResponse> 
    </S:Body> 
</S:Envelope> 

好吧,之后我做的目标C这个请求:

ConfigViewController.h

@interface ConfigViewController : UITableViewController 
{ 
NSMutableData *webData; 
    NSXMLParser *xmlParser; 
    NSString *finaldata; 
    NSString *convertToStringData; 
    NSMutableString *nodeContent; 

} 
-(IBAction) buttonPressed: (id) sender; 


@end 

ConfigViewController.m

#import "ConfigViewController.h" 

@implementation ConfigViewController 

... 

- (IBAction)buttonPressed:(id)sender 
{ 

nodeContent = [[NSMutableString alloc]init]; 

    NSString *soapFormat = [NSString stringWithFormat: 
          @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 
          "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" 
          "<soap:Body>\n" 
          "<ns2:hello xmlns:ns2=\"http://org/\" />\n" 
          "<name>david</name>\n" 
          "</ns2:hello>\n" 
          "</soap:Body>\n" 
          "</soap:Envelope>\n"]; 



    NSLog(@"The request format is: \n%@",soapFormat); 

    NSURL *locationOfWebService = [NSURL URLWithString:@"http://localhost:8080/WSServer/Catalogo_V1?wsdl"]; 

    NSLog(@"web url = %@",locationOfWebService); 

    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc]initWithURL:locationOfWebService]; 

    NSString *msgLength = [NSString stringWithFormat:@"%d",[soapFormat length]]; 


    [theRequest addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"]; 
    [theRequest addValue:@"http://localhost:8080/WSServer/Catalogo_V1?wsdl" forHTTPHeaderField:@"SOAPAction"]; 
    [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
    [theRequest setHTTPMethod:@"POST"]; 
    //the below encoding is used to send data over the net 
    [theRequest setHTTPBody:[soapFormat dataUsingEncoding:NSUTF8StringEncoding]]; 


    NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:theRequest delegate:self]; 

    if (connect) { 
     webData = [[NSMutableData alloc]init]; 
    } 
    else { 
     NSLog(@"No Connection established"); 
    } 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webData setLength: 0]; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [webData appendData:data]; 
} 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"ERROR with theConenction"); 
    [connection release]; 
    [webData release]; 
} 

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    return YES; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]; 
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
} 


-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"DONE. Received Bytes: %d \n", [webData length]); 
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"\n%@",theXML); 
[connection release]; 
} 

... 

@end 

我的控制台显示:

2011-09-02 10:17:32.748 Catalogo-V1[1131:207] The request format is: 
    <?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ns2:hello xmlns:ns2="http://org/" /> 
    <name>david</name> 
    </ns2:hello> 
    </soap:Body> 
    </soap:Envelope> 
    2011-09-02 10:17:32.749 Catalogo-V1[1131:207] web url = http://localhost:8080/WSServer/Catalogo_V1?wsdl 
    2011-09-02 10:17:32.757 Catalogo-V1[1131:207] DONE. Received Bytes: 224 
    2011-09-02 10:17:32.757 Catalogo-V1[1131:207] 
    <?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> 
+1

而你的问题是......?你为什么得到你好空? – Radu

+0

我的问题是为什么没有发送参数? – Davidin073

回答

0

根据您在控制台中显示的内容,您制定的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元素,和你不。虽然这不太可能成为问题。

+0

非常感谢你! – Davidin073

+0

也许你可以解决这个问题:http://stackoverflow.com/questions/7247841/soap-client-objective-c-dont-send-params – Davidin073

+0

类似于此:http://stackoverflow.com/questions/7255688/ objective-c-soap-client-request-problem – Davidin073