搜索
您的当前位置:首页正文

WebService之Soap请求

来源:二三娱乐

一、让人一眼懵逼的概念

  • 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解析
}];

五、结束语

Top