iOS--对接soap协议接口

最近在对接soap协议接口,分别使用AFN和系统自带方法进行解析。soap协议具体是什么就不阐述了,可以自行百度。

说一下需要注意的地方:

1,iOS与soap协议接口对接,参数要传xml格式的字符串,具体格式看接口说明,务必保持一致;

2,soap1.1和soap1.2使用思路是一样的,但是设置的参数不一样,具体看代码;

3,soap协议的返回值也是xml格式的,需要进行xml解析,获取需要节点下的数据(这里强调一点,可以根据某个节点获取需要的数据,但是也可以不管xml的节点,直接通过根节点获取需要的数据,这个是看后台怎么返回的).

首先看一下要传递的参数格式:说白了就是一个请求体,只不过是xml格式的而已

    NSString *soapMessage = [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>                          <xiaoxi xmlns= \"http://tempuri.org/ \"> \
                         <typeValue>%@</typeValue>                         </xiaoxi>                          </soap:Body>                          </soap:Envelope>",@"147"];

用系统自带的方法进行解析:

#pragma mark - 用系统自带的
- (void)postWithSoapMessage:(NSString *)message {

    // url
    NSURL *url = [NSURL URLWithString:XMHTTPADDRESS];
    // request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 设置POST请求方式
    [request setHTTPMethod:@"POST"];
    // SOAPAction  soap1.1必须设置 soap1.2不设置
    [request addValue:@"http://tempuri.org/UserLogin" forHTTPHeaderField:@"SOAPAction"];
    /*
     * Content-Type
     * soap1.1  text/xml; charset=utf-8
     * soap1.2 application/soap+xml; charset=utf-8
     */
    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    // 请求字节数
    [request addValue:[NSString stringWithFormat:@"%zd", message.length] forHTTPHeaderField:@"Content-Length"];
    // 设置请求体 utf-8编码
    [request setHTTPBody:[message dataUsingEncoding:NSUTF8StringEncoding]];
    // session
    NSURLSession *session = [NSURLSession sharedSession];
    // task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 结果
        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        XMLog(@"result = %@",result);
    }];
    [task resume];
}

用AFN进行解析

//POST请求  这里稍微封装了下,便于自己使用,看主要的就可以....
- (void)postWithSoapAction:(NSString *)action parameters:(NSString *)soapMessage success:(Success)success failure:(Failure)failure {

    afnManager.responseSerializer = [AFHTTPResponseSerializer serializer];
    afnManager.requestSerializer = [AFHTTPRequestSerializer serializer];
    /*
     * 一般情况AFN请求参数只能传字典
     * 但是可以在这个方法里将请求参数变成字符串形式
     */
    [afnManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id  _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {

        return soapMessage;
    }];
    // 请求设置
    [afnManager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [afnManager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapMessage.length] forHTTPHeaderField:@"Content-Length"];
    [afnManager.requestSerializer setValue:[NSString stringWithFormat:@"http://tempuri.org/%@",action] forHTTPHeaderField:@"SOAPAction"];

    // post请求
    [afnManager POST:XMHTTPADDRESS parameters:soapMessage progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [SVProgressHUD dismiss];
        if (responseObject) {

            NSString *response = [self getJsonStringWithData:responseObject];
            success(response);
        }else {
            XMLog(@"%@",@"请求失败");
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        failure(error);
    }];
}

踩了不少坑,,但是还是搞定了。。。

时间: 2024-10-01 05:22:35

iOS--对接soap协议接口的相关文章

jmeter测试SOAP协议接口

jmeter3.2版本之后就没有SOAP/XML-RPC Request插件了,所以没办法直接进行webservice接口的测试. 原理上: Web service一般就是用SOAP协议通过HTTP来调用它,其实他就是一个WSDL文档,客户都可以阅读WSDL文档来用这个Web service. SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议:RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INT

【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发

目录: 创建WebService接口模拟服务端 下载SoapUI 新建MathUtil.wsdl文件 创建一个SOAP项目 接口模拟服务端配置以及启动 [阐述]:首先应该遇到了一个共同的问题,JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作,结果是一样的. 具体资料大家可以参照原文<Jmeter测试SOAP协议(Jmeter 3.3)>感谢作者:stone9159 [步骤]: 一.创建WebService接口模拟

iOS之代理/协议 @protocal

理解: @protocal 可以定义一个协议.一个类如果使用了这个协议,那么就要按照这个协议要求的去办事.最常见的就是UITableViewDelegate.UITableViewDataSource这个两个家伙.我们的类可以使用这两个协议,并对协议定义的方法进行实现(numberOfRowsInSection, heightForRowAtIndexPath...),然后需要绑定.因为我们的类已经实现了这个这两个协议.所以我们类中的tableview可以这样绑定: tableview.dele

android soap协议与webservice

今天偶然听说到soap协议的数据传输,没事就来看看,简单上网搜了下,总结如下: 首先,soap与http.socket都是一种数据传输协议,并不是说webservice一定要用soap协议,只不过webservice的主要目的是让数据进行跨平台传递,相当于两个应用或者服务之间的数据桥梁,而soap协议是xml的数据格式,几乎所有的主流的应用平台都可以使用,所以使用web+soap. 但是问题来了,xml的解析是非常消耗内存和cpu的,并不建议使用在手机上. 其次,我理解使用webservice的

YII框架之soap协议的配置跟使用(Webservice)

Yii依靠文档注解(doc comments)和类反射(class reflection)来识别哪个方法可以被远程调用,包括他们的参数和返回值,但目前只能返回字符串,不能返回数组,若返回数组,则为"array";故我将返回值转换为json字符串再返回. 1. 定义Service Provider,服务器端文件代码,WebServerController.php <?php /****************************** * @author sara zhou *

蛋疼的Apple IOS Push通知协议

简介 Apple Push通知机制其实很简单,就是Apple的APNs服务器做为中间人,把消息推送到对应的设备上. 一张来自Apple文档的图: 当然,示意图看起来简单,但是还有一些实际的问题. 比如,如何区分Provicer的?如何区分设备的? 简单而言,是这样的: 每个应用都有一个自己的证书(certificate),开发者可以从苹果那里获得: 应用可以到APNs服务器上注册(register),然后得到一个device_token,开发者要自己保存好,推送时就要用这个来区分不同的设备. 注

webservice通过soap协议出现不能加载wsdl文件解决办法

PHP在用SOAP协议做接口的时候,经常会碰到如下问题,不是不成功,而是偶尔不成功,实在让人费解! ERR: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.xxxxx.com/member/member_sync.php?wsdl' : failed to load external entity "http://www.xxxxx.com/member/member_sync.php?wsdl" 查找日志发现: NO

Android与服务器端数据交互(基于SOAP协议整合android+webservice)

此文出自:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端action请求数据.当然调用服务器端方法获取数据并不止这一种.WebService也可以为我们提供所需数据, 那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起. 我们在PC机器java客

Java实现SOAP协议 之 HelloWorld

Java实现SOAP协议 之 HelloWorld SOAP是把基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起. 准备: 1. 准备一个web server.Tomcat 下载地址 http://tomcat.apache.org/ 本例使用版本 apache-tomcat-7.0.54-windows-x64.zip 2. 写一个servlet send用来发送一个SOAP的message并添加一个附件. 3. 写一个servlet receive用来做SOAP message