如何使用AFNetworking或STHTTPRequest来请求SOAP Web服务?

我能够使用NSURLConnection NSMutableURLRequest连接到SOAP Web服务,如下所示:

 NSString *soapMessage = [NSString stringWithFormat:@"<?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>" "<CelsiusToFahrenheit xmlns=\"http://www.w3schools.com/webservices/\">" "<Celsius>140.0</Celsius>" "</CelsiusToFahrenheit>" "</soap:Body>" "</soap:Envelope>"]; NSData *soapData = [soapMessage dataUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:@"http://w3schools.com/webservices/tempconvert.asmx"]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMessage length]]; [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest addValue: @"http://www.w3schools.com/webservices/CelsiusToFahrenheit" forHTTPHeaderField:@"SOAPAction"]; [theRequest addValue:@"www.w3schools.com" forHTTPHeaderField:@"Host"]; [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPMethod:@"POST"]; [theRequest setHTTPBody:soapData]; 

我怎样才能使用AFNetworking或STHTTPRequest ?

STHTTPRequest

 //create request STHTTPRequest *request = [STHTTPRequest requestWithURL:url]; //set header here [request setHeaderWithName:@"Host" value:@"www.w3schools.com"]; [request setHeaderWithName:@"SOAPAction" value: @"http://www.w3schools.com/webservices/CelsiusToFahrenheit"]; [request setHeaderWithName:@"Content-Type" value:@"text/xml; charset=utf-8"]; //set body here request.rawPOSTData = soapData; //completion block request.completionBlock = ^(NSDictionary *headers, NSString *body) { NSLog(@"headers = %@\nbody = %@", headers, body); //parse xml string object here as request is successfull if (body.length > 0) { NSError *error= nil; NSDictionary *dict = [XMLReader dictionaryForXMLString:body error:&error]; if (!error) { NSLog(@"XML Dictionary: %@",dict); //do necessary requirement here } else NSLog(@"Error while parsing xml data : %@",[error description]); } else NSLog(@"No response from request"); }; //error block request.errorBlock = ^(NSError *error) { NSLog(@"%@",[error description]); }; //start request [request startAsynchronous]; 

AFNetworking

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:theRequest]; operation.responseSerializer = [AFXMLParserResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //parse NSXMLParser object here if request successfull if ([responseObject isKindOfClass:[NSXMLParser class]]) { NSXMLParser *parser = (NSXMLParser *)responseObject; NSDictionary *dict = [XMLReader dictionaryForNSXMLParser:parser]; NSLog(@"JSON: %@ : %@", responseObject,dict); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; [[NSOperationQueue mainQueue] addOperation:operation]; 

这里XMLReader使用NSXMLParser提供XMLData NSDictionary

我已经在XMLReader类中添加了一个更多的方法:

 +(NSDictionary*)dictionaryForNSXMLParser:(NSXMLParser*)parser error:(NSError **)error 

编辑 :方法说明

 + (NSDictionary *)dictionaryForNSXMLParser:(NSXMLParser *)xmlParser error:(NSError **)error { XMLReader *reader = [[XMLReader alloc] initWithError:error]; NSDictionary *rootDictionary = [reader objectWithNSXMLParser:xmlParser options:0]; return rootDictionary; } 

objectWithNSXMLParser方法。

 - (NSDictionary *)objectWithNSXMLParser:(NSXMLParser *)xmlParser options:(XMLReaderOptions)options { // Clear out any old data self.dictionaryStack = [[NSMutableArray alloc] init]; self.textInProgress = [[NSMutableString alloc] init]; // Initialize the stack with a fresh dictionary [self.dictionaryStack addObject:[NSMutableDictionary dictionary]]; [xmlParser setShouldProcessNamespaces:(options & XMLReaderOptionsProcessNamespaces)]; [xmlParser setShouldReportNamespacePrefixes:(options & XMLReaderOptionsReportNamespacePrefixes)]; [xmlParser setShouldResolveExternalEntities:(options & XMLReaderOptionsResolveExternalEntities)]; xmlParser.delegate = self; BOOL success = [xmlParser parse]; // Return the stack's root dictionary on success if (success) { NSDictionary *resultDict = [self.dictionaryStack objectAtIndex:0]; return resultDict; } return nil; }