WebService之Soap请求

作者: CoderXLL | 来源:发表于2018-04-12 18:21 被阅读182次

    一、让人一眼懵逼的概念

    • WebService
      就是一个应用程序,它向外界暴露出一个可以通过web进行调用的API,是分布式的服务组件。
    • Soap
      一个基于xml格式的web交互协议。

    从上面两组概念可以看出,webService服务组件是为了实现Soap协议的一个工具。<span style="border-bottom:2px dashed yellow;">简单来说,Soap请求就是向服务器传递xml数据,服务器向客户端也返回xml数据。</span>

    二、前期准备

    首先打开你的接口文档,你会发现一个公司的WebService服务地址。打开它。

    • 如果后台的哥哥们不找事的话,打开来的效果一般是这样的。
      soap请求响应示例
      这里面包括了Soap请求所需要的默认的请求信息SOAPAction(soap1.1需要,soap1.2不需要)请求的xml结构等重要信息。
    • 当然如果后台装逼的话,打开服务地址可能是这样的。
      装逼的soap请求响应示例
      大家看到了吗,还需要一个.exe的工具,运行命令。会生成.config文件。这个文件包含的信息应该和上面的一样。坑的一批,体会过mac电脑的感受吗?反正我没搞,也搞不了。最后是安卓的兄弟们搞的。

    三、精妙拼接请求体

    将上面获取的默认的请求信息,作为单独的一个方法进行处理。因为客户端所要传的参数都是要放到body节点元素下的,所以我们在这个节点下使用%@来对以后传入的参数预留位置。

    + (NSString *)defaultSoapMessage
    {
        NSString *soapBody=@"<soapenv:Envelope 
    xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" 
    xmlns:tem=\"http://tempuri.org/\">""
    <soapenv:Body>%@</soapenv:Body>
    </soapenv:Envelope>";
        return soapBody;
    }
    

    然后就是拼接body节点下的xml数据。我处理项目的时候,这个xml数据有三种拼接情况。

    1. 接口没有参数
      这种情况下,一般是将方法名单独作为一个节点,拼接放入body节点下。
    2. 以每个参数作为单独节点,参数对应的value值作为节点值。拼接放入body节点下。
    3. 以一个固定的节点名,如input节点。节点值为参数的json字符串。

    总之,根据文档上的要求,对应着自己拼接即可。

    四、NSURLConnection进行请求

    //1.根据地址生成请求实例
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //2.拼接的body长度
    NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMessage1 length]];
    //3.设置请求头
    //3.1请求内容类型(xml类型)
    [request addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    //3.2请求体长度
    [request addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    //3.3SOAPAction(一开始获取的)
    [request addValue:[NSString stringWithFormat:@"%@%@", defaultSOAPActionStr, methodName] forHTTPHeaderField:@"SOAPAction"];
    //4.请求类型(POST类型)
     [request setHTTPMethod:@"POST"];
    //5.设置请求体
    [request setHTTPBody: [soapMessage1 dataUsingEncoding:NSUTF8StringEncoding]];
    //6.开始请求  
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, id data, NSError * _Nullable connectionError) {
              //7.在回调里进行容错逻辑与xml解析
    }];
    

    五、结束语

    以上就是与后端对接Soap请求的一整套流程。
    这是编写的soap请求类
    单独为请求开辟一个名为XLLBaseSoapEngine的线程,并在线程添加Runloop为线程保活。
    参考文章:https://www.cnblogs.com/cocoajin/p/6518024.html

    相关文章

      网友评论

        本文标题:WebService之Soap请求

        本文链接:https://www.haomeiwen.com/subject/vpftqftx.html