如何在ios中向soap webservice发送请求?

Posted

技术标签:

【中文标题】如何在ios中向soap webservice发送请求?【英文标题】:How to send request to soap webservice in ios? 【发布时间】:2016-03-24 07:19:38 【问题描述】:

您好,我想向soap 网络服务发送请求。我尝试使用 AFnetworking 并获得内部服务器错误 500,现在我尝试使用 nsurlconnection 但它也显示状态代码 400。请任何人帮助我。谢谢提前听到是我的代码。

NSString *soapString = [NSString stringWithFormat:
                                    @"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><addBusOrder xmlns=\"http://tempuri.org/\"><UserUniqueID>ok//8FjcvEKWMeeJJZHKYA</UserUniqueID><PlatFormID>4</PlatFormID><DeviceID>E3D2FCF6-F41B-4275-BD34-FAA31307EFFE</DeviceID><RouteScheduleId>532875503</RouteScheduleId><JourneyDate>2016-03-25</JourneyDate><FromCityid>734</FromCityid><ToCityid>202</ToCityid><TyPickUpID>22860424</TyPickUpID><Contactinfo><Name>vinod</Name><Email>katragadda.vinod@gmail.com</Email><Phoneno>7842768497</Phoneno><mobile>8801720427</mobile></Contactinfo><pass><passenger><passengerName>kumar</passengerName><Age>23</Age><Fare>1072</Fare><Gender>M</Gender><Seatno>D3</Seatno></passenger></pass></addBusOrder></soap:Body></soap:Envelope></addBusOrder></soap12:Body></soap12:Envelope>"];
            NSLog(@"soapString %@",soapString);

    NSString *msgLength = [NSString stringWithFormat:@"%li", [soapString length]];

    NSString *queryString = [NSString stringWithFormat: @"https://asprel.in/Service/AppServices.asmx/addBusOrder"];

    NSURL *url = [NSURL URLWithString:queryString];

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];

    [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    [req addValue:@"http://tempuri.org/addBusOrder" forHTTPHeaderField:@"SOAPAction"];
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody: [soapString dataUsingEncoding:NSUTF8StringEncoding]];


    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
        if (connectionError) 
            NSLog(@"error %@",connectionError);
        else
            NSLog(@"data %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        


        NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
        [parser parse];

    ];

错误:

status code: 500, headers 
    "Access-Control-Allow-Origin" = "*";
    "Cache-Control" = private;
    "Content-Length" = 322;
    "Content-Type" = "text/plain; charset=utf-8";
    Date = "Thu, 24 Mar 2016 07:08:32 GMT";
    Etag = "\"\"";
    Server = "Microsoft-IIS/8.0";
    "X-AspNet-Version" = "4.0.30319";

【问题讨论】:

【参考方案1】:

您需要 API 授权

尝试添加授权

 // Create the request
 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];

// New Create the connection
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *session = [NSURLSession sharedSession];//sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];

//  NSURLCredential *creds = [NSURLCredential credentialWithUser:self.username password:self.password persistence:NSURLCredentialPersistenceForSession];

NSString *authStr = [NSString stringWithFormat:@"%@:%@",username API,password API];// @"username:password";

NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];

NSString *authValue = [NSString stringWithFormat: @"Basic %@",[authData base64EncodedStringWithOptions:0]];

// Part Important
[request setValue:authValue forHTTPHeaderField:@"Authorization"];

[request addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[request addValue:@"http://tempuri.org/addBusOrder" forHTTPHeaderField:@"SOAPAction"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody: [soapString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request     
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 

                 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
                [parser parse];

                NSLog(@"%@",responseData);
                    if (error) 
                         [self handleError: error];
                    
 ];

[dataTask resume];

NSLog(@"Header Request--->> %@",request.allHTTPHeaderFields);

【讨论】:

以上是关于如何在ios中向soap webservice发送请求?的主要内容,如果未能解决你的问题,请参考以下文章

QT 中向webservice发送xml数据请求

在c#中,用soap调用webservice,发送消息并取得webservice方法里返回的内容,用http 的方法

如何将soap请求中的字符串数组发送到webservice

如何使用 AFNetworking 3.x 在 ios、objective-C 中使用来自 SOAP webservice 的数据

Jmeter发送SOAP请求对WebService接口测试

java使用POST发送soap报文请求webservice返回500错误解析