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

五、结束语

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,120评论 19 139
  • 前言 刚入职新公司,负责其Android App的开发,他们的接口访问是通过SOAP协议实现的(基于xml数据格式...
    Mersens阅读 14,887评论 54 79
  • 配置xml一定要有sql语句一定要有where 测试
    林隆阅读 2,415评论 0 0
  • ——写在意外受伤之后 上周日晚上,我回家的路上,两个脚趾意外受伤,让我健走间歇一周,也让我有时间反思一下如何能长久...
    褚洪嘉阅读 1,558评论 0 0
  • 人是一种很奇妙的生物,有情绪就必然有高峰和低谷。很多时候你会觉的好事成双,有些时候你也会体会到祸不单行。 有的人动...
    米盼盼是个小笨蛋阅读 1,360评论 0 0

友情链接更多精彩内容