我已经编写了soap_parser 类来阅读制作SOAP 消息,它的实现非常简单,只需按照步骤和您的问题进行操作即可。
soap_parser.h
第 1 步:使用以下代码创建一个 .h 文件并进行适当的域更改
#error Set Your Request Domain & Webservice name
#define DOMAIN_URL @"http://yourDomain.com/WebService/"
#define SERVICE_URL DOMAIN_URL@"/iphoneservice.asmx"
#define TEMP_URL @"http://tempuri.org"
#import <Foundation/Foundation.h>
@protocol soap_parser_delegate <NSObject>
@optional
-(void)receivedResponseWithStatusCode:(NSInteger)statusCode;
-(void)requestFailedWithError:(NSError *)err;
@required
-(void)dataReceivingCompleted:(NSMutableData *)data;
@end
@interface soap_parser : NSObject
{
NSMutableURLRequest *soap_request;
NSURLResponse *soap_response;
NSMutableData *soap_responseData;
NSString *currentAction;
id <soap_parser_delegate>delegate;
}
@property (nonatomic, retain) NSMutableData *soap_responseData;
@property (nonatomic, retain) NSString *currentAction;
@property (nonatomic, retain) id <soap_parser_delegate>delegate;
#pragma mark - Initialize Parsing
-(void)startParsingWithAction:(NSString *)action andWithParams:(NSDictionary *)params;
#pragma mark - Create SOAP message
-(NSString *)createSoapMesssageFrom:(NSDictionary *)requestParam;
@end
soap_parser.m
第 2 步:使用以下代码创建一个 .m 文件
#import "soap_parser.h"
@implementation soap_parser
@synthesize soap_responseData, currentAction, delegate;
#pragma mark - Initialize Parsing
-(void)startParsingWithAction:(NSString *)action andWithParams:(NSDictionary *)params
{
self.currentAction = action;
NSString *reqSOAPmsg = [self createSoapMesssageFrom:params];
NSURL *url = [NSURL URLWithString:SERVICE_URL];
soap_request = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [reqSOAPmsg length]];
[soap_request addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[soap_request addValue: [NSString stringWithFormat:@"%@/%@",TEMP_URL,self.currentAction] forHTTPHeaderField:@"SOAPAction"];
[soap_request addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[soap_request setHTTPMethod:@"POST"];
[soap_request setHTTPBody: [reqSOAPmsg dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *cn = [[NSURLConnection alloc] initWithRequest:soap_request delegate:self];
[cn start];
}
#pragma mark - Create SOAP message
-(NSString *)createSoapMesssageFrom:(NSDictionary *)requestParam
{
NSMutableString *soapMessage = [[NSMutableString alloc] init];
[soapMessage appendFormat:@"<?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"
"<%@ xmlns=\"http://tempuri.org/\">\n",self.currentAction];
for(NSString *key in requestParam)
{
[soapMessage appendFormat:@"<%@>%@</%@>\n",key,[requestParam valueForKey:key],key];
}
[soapMessage appendFormat:@"</%@>\n"
"</soap:Body>\n"
"</soap:Envelope>",self.currentAction];
NSLog(@"%@",soapMessage);
return soapMessage;
}
#pragma mark - NSURLConnection Delegate
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
if([delegate respondsToSelector:@selector(receivedResponseWithStatusCode:)])
{
[delegate performSelector:@selector(receivedResponseWithStatusCode:) withObject:httpResponse];
}
self.soap_responseData = [[NSMutableData alloc] initWithCapacity:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.soap_responseData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
if([delegate respondsToSelector:@selector(requestFailedWithError:)])
{
[delegate performSelector:@selector(requestFailedWithError:) withObject:error];
}
connection = nil;
self.soap_responseData = nil;
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if([delegate respondsToSelector:@selector(dataReceivingCompleted:)])
{
[delegate performSelector:@selector(dataReceivingCompleted:) withObject:self.soap_responseData];
}
}
@end
第 3 步:在您的#import "soap_parser.h"
.h文件中,您要在其中进行 soap 调用。<soap_parser_delegate>
ViewController
第 4 步:在 .m 文件中实现以下委托方法
#pragma mark - SOAP parser Delegate
-(void)receivedResponseWithStatusCode:(NSInteger)statusCode
{
NSLog(@"Status Code : %d",statusCode);
}
-(void)requestFailedWithError:(NSError *)err
{
NSLog(@"Failed : %@",[err description]);
}
-(void)dataReceivingCompleted:(NSMutableData *)data
{
NSLog(@"Response Data Length : %d",data.length);
NSString *responseString = [[NSString alloc] initWithBytes:[data mutableBytes] length:[data length] encoding:NSUTF8StringEncoding];
NSLog(@"%@",responseString);
#warning Do something with your Response Data
}
第 5 步:创建一个包含数据的字典,以在 SOAP 请求中发送以调用您的 SOAP_WEBSERVICE,然后休息一下。
NSDictionary *dictParams = [NSDictionary dictionaryWithObjectsAndKeys:@"CUST ID", @"cust",
@"Transaction ID",@"tran",
@"Ret Value",@"ret",
@"PPAY Value",@"ppay",
@"RECP Value",@"recp",
@"SCODE Value",@"sCode",
@"MY COMPANY LTD.",@"companyShortName",
@"COMPANY_007",@"companyCode", nil];
// Create Object of SOAP_Parser
soap_parser *objSOAP = [[soap_parser alloc] init];
// Set Delegate to self
[objSOAP setDelegate:self];
// Send Request with param Dictionary
[objSOAP startParsingWithAction:@"UserLogin" andWithParams:dictParams];