一、让人一眼懵逼的概念
- 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数据有三种拼接情况。
- 接口没有参数
这种情况下,一般是将方法名单独作为一个节点,拼接放入body节点下。 - 以每个参数作为单独节点,参数对应的value值作为节点值。拼接放入body节点下。
- 以一个固定的节点名,如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
网友评论