SOAP WebService在传递参数时没有给出响应

时间:2013-04-26 06:44:32

标签: objective-c xcode

This is SOAP WebService method:

<PostXMLStr xmlns="http://tempuri.org/">
      <cust>string</cust>
      <tran>string</tran>
      <ret>string</ret>
      <ppay>string</ppay>
      <recp>string</recp>
      <sCode>string</sCode>
      <companyShortName>string</companyShortName>
      <companyCode>string</companyCode>

This is what i calling SOAP:
<PostXMLStr xmlns=\"http://tempuri.org/\">\n"
    "      <cust><NEWCUSTOMERS><NEWCUSTOMER></NEWCUSTOMER></NEWCUSTOMERS></cust>\n"
    "      <tran><TRANS><TRAN></TRAN></TRANS></tran>\n"
    "       <ret><RETURNS><RETURN></RETURN></RETURNS></ret>\n"
    "       <ppay><PREPAYMENTS></PREPAYMENTS></ppay>\n"
    "       <recp><RECEIPTS><RECEIPT></RECEIPT></RECEIPTS></recp>\n"
    "       <sCode>BB</sCode>\n"
    "   <companyShortName>SAMINC</companyShortName>\n"
    "   <companyCode>01</companyCode>\n"

将参数传递给SOAP WebService时遇到了一些问题。我无法找到它。当我调用另一个没有参数的SOAP WebService给我响应时。我假设传递参数有问题。我们将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经编写了soap_parser类来阅读制作SOAP Message,它非常直接实现,只需按照步骤操作即可解决问题。

步骤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

步骤2:使用以下代码

创建.m文件soap_parser.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_parser_delegate>ViewController,您要拨打肥皂电话。

步骤4:在.m文件中实现以下Delegate方法

#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];