iOS调用WebService接口

首先有几点说在前面

soap字符串

使用常见的AFNetworking 进行请求,请求分为两个部分,URL和parameter,URL就是后台给你的接口,这个parameter需要填写入一个完整的带有参数的soap字符串。

soap字符串格式如下:

1.命名空间在根目录上

<?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/" 
xmlns:前缀名(如:nsl)="webservice命名空间">
//前缀名一般是nsl,webservice命名空间找后台要
    <soap:Header>
      //此处填写头内容
      //有请求头就加上,没上就可去悼soap:Header标签
    </soap:Header>
    <soap:Body>
        <前缀名:方法名>
            <参数名1>参数值1</参数名1>
            <参数名2>参数值2</参数名2>
            .......
        </前缀名:方法名>
    </soap:Body>
</soap:Envelope>

下面给一个根据参数userId请求数据的例子
  • 前缀名是nsl
  • 命名空间是http://cxfServer.fh.com
NSString * soapBodyStr = [NSString stringWithFormat:@"<nsl:queryCheckList>
                           <userId>%@</userId>
                           </nsl:queryCheckList>",userId];

NSString *soapStr = [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/"
                         //自己填写的前缀名和命名空间
                         xmlns:nsl="http://cxfServer.fh.com/">
                         <soap:Body>
                         //使用已拼接好的字符串soapBodyStr再次拼接进来
                         %@</soap:Body>
                         </soap:Envelope>",soapBodyStr];

这样作为参数的soap字符串就拼接好了。

2.还有一种情况是命名空间在方法名上则soap字符串格式如下:

<?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:Header>
    //有头内容就写,没有就不写soap:Header标签
  </soap:Header>  
  <soap:Body>    
    <方法名 xmlns="webservice命名空间">      
    <参数1>参数值1</参数1>      
    <参数2>参数值2</参数2>
 </方法名>
 </soap:Body>
 </soap:Envelope>

同样使用上面的例子,则soap字符串如下:

NSString * soapBodyStr = [NSString stringWithFormat:
                            @"<queryCheckList xmlns="http://cxfServer.fh.com/">
                           <userId>%@</userId>
                           </queryCheckList>",userId];

NSString *soapStr = [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>
                         //使用已拼接好的字符串soapBodyStr再次拼接进来
                         %@</soap:Body>
                         </soap:Envelope>",soapBodyStr];

使用AF进行完整请求

soap字符串已经完整拼接完成,下面进行该请求数据了

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 设置请求超时时间
    manager.requestSerializer.timeoutInterval = 60;
    // 返回NSData
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 设置请求头,也可以不设置
    [manager.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
    // 设置HTTPBody
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) 
    {
        return soapStr;
    }];
    [manager POST:url1 parameters:soapStr success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        // 把返回的二进制数据转为字符串
        NSString *result = [[NSString alloc] initWithData:responseObject                            encoding:NSUTF8StringEncoding];
        //使用自己写的请求方法resultWithDiction进行解析
        NSDictionary * dic = [self resultWithDiction:result];
        //通过Block传回数据
        success(dic);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            NSLog(@"%@",error);
            failure(error);
        }
    }];

一个完整的调用WebService的请求就完成了。

原文地址:https://www.cnblogs.com/jx66/p/6971561.html