我有一个应用程序使用ASIHttpRequest消费SOAP Web服务,现在我想(或必须)使用其他网络框架,我选择了AFNetworking,但看不出我该如何消费SOAP,她就是我如何使用ASIHttpRequest:
NSString *operation=[NSString stringWithString:@"search_service"];
NSString *xmlNamespace=[NSString stringWithString:@"http://www.xxx.com/wsdl"];
NSString *address=[NSString stringWithString:@"http://www.xxx.com/service"];
NSString *parameters=[NSString stringWithFormat:@"<param1>%@</param1><param2>%@</param2>",
@"val1",
@"val2",
];
NSString *operatorTag = [NSString stringWithFormat:@"<%@ xmlns="%@">%@</%@>n", operation, xmlNamespace, parameters, operation];
NSString *soapMessage = [NSString stringWithFormat:
@"<?xml version="1.0" encoding="utf-8"?>n"
"<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">n"
" <s:Header>n"
" <To xmlns="http://www.w3.org/2005/08/addressing">%@</To>n"
" <a:Action>http://tempuri.org/IService1/%@</a:Action>n"
" </s:Header>n"
" <s:Body>n"
" %@"
" </s:Body>n"
"</s:Envelope>n", address, operation, operatorTag
];
asiRequest = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:address]];
[asiRequest setDelegate:self];
[asiRequest addRequestHeader:@"application/soap+xml; charset=utf-8" value:@"Content-Type"];
[asiRequest setRequestMethod:@"POST"];
[asiRequest setPostBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
[asiRequest startAsynchronous];
编辑:这就是我尝试的AFNetworking:
NSString *operationWSDL= @"search_service";
NSString *xmlNamespace= @"http://www.xxx.com/wsdl";
NSString *address= @"http://www.xxx.com/service";
NSString *parameters=[NSString stringWithFormat:@"<param1>%@</param1><param2>%@</param2>",@"val1",@"val2",];
NSString *operatorTag = [NSString stringWithFormat:@"<%@ xmlns="%@">%@</%@>n", operationWSDL, xmlNamespace, parameters, operationWSDL];
NSString *soapMessage = [NSString stringWithFormat:
@"<?xml version="1.0" encoding="utf-8"?>n"
"<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">n"
" <s:Header>n"
" <To xmlns="http://www.w3.org/2005/08/addressing">%@</To>n"
" <a:Action>http://tempuri.org/IService1/%@</a:Action>n"
" </s:Header>n"
" <s:Body>n"
" %@"
" </s:Body>n"
"</s:Envelope>n", address, operationWSDL, operatorTag
];
NSURL *url = [NSURL URLWithString:@"http://www.xxx.com/service"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
[formData appendPartWithHeaders:[NSDictionary dictionaryWithObjectsAndKeys:@"application/soap+xml; charset=utf-8",@"Content-Type", nil] body:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];
[operation start];
您尝试过WSDL2Objc吗?http://code.google.com/p/wsdl2objc/.我最近在我的项目中使用了它。它成功地生成了类(从使用的WSDL)来使用SOAP服务。我认为这将是更好的解决方案。