Objective C SOAP Request with Java Web Service
I have a simple Web service in Java:
@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 + " !";
}
}
I have done a Test in this web service: (http://localhost:8080/WSServer/Catalogo_V1?Tester)
Method returned
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 Response
<?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>
Ok, after that i have done this request in Objective 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 bel开发者_JS百科ow 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
My console show:
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>
According to what you've shown from your console, the XML request you formulated is invalid. You have
<ns2:hello xmlns:ns2="http://org/" />
<name>david</name>
</ns2:hello>
But you should have (note the removal of the invalid XML tag termination):
<ns2:hello xmlns:ns2="http://org/>
<name>david</name>
</ns2:hello>
Also note that your working sample request includes a soap:Header element, and yours does not. That is unlikely to be the problem here though.
精彩评论