SOAP メッセージの作成方法を理解するために、soap_parser クラスを作成しました。実装は非常に簡単です。手順に従って問題を解決してください。
ステップ 1: 次のコードで .h ファイルsoap_parser.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: .h ファイル#import "soap_parser.h"
で<soap_parser_delegate>
、ViewController
soap 呼び出しを作成する場所。
ステップ 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];