iOS - AFNetworking3.0 发送SOAP请求到Webservice
2017-12-07 17:22
477 查看
这两天一直在搞一个问题,请求接口要就是添加请求头,本想着这个简单呀,(本人用的AFNetworking3.0),afnet封装好的添加header:
但是就是请求不成功,期间也问了一些朋友都说他们也是这样添加的,安卓的也可以请求成功,这就很尴尬了!!!
难道Webservice的SOAP请求这么难?于是就开始查资料,发现还是自己想简单了,SOAP请求不能直接这样添加header(或许也可以,可能我们的情况比较特殊),看下SOAP请求的测试。
SOAP协议实际上就是一种基于XML编码规范的文本协议。目前WebService的协议主要有SOAP1.0、SOAP1.1和1.2(我们用的是1.1)。soap默认POST请求,GET好像不可以,SOAP协议的版本会影响请求是否成功。
SOAP1.1
SOAP1.2
上面框内就是请求头的添加,我们的服务器还加了请求头识别WyxSoapHeader,必须要有这个,不然请求不成功。下面的框内是参数。你还会发现这个两个框内都有一个东西就是:
这里的WyxSoapHeader上面说了,VerifyAppUserPassword就是接口方法,http://www.wincansoft.com/wyxsms就是命名空间,这些个都是后台给的,没有找他要。
下面我们就要开始按照上面的格式拼接SOAP1.1字符串:举个例子
开发的时候,不能每调用一次接口,都写一遍这一大串东西吧,把这个写成一个方法供外部调用就OK啦。首先要封装一个参数生成字符串方法:
再封装SOAP字符串:
OK,到这里准备工作基本完毕,现在开始请求:
上面的URLString是请求地址,不知道是啥或没有问后台要,他清楚的。
OK到这里,一个完整的SOAP带有请求头的请求就完成了。
安卓的就简单多了,不需要拼接这些玩意:
直接设置就好了,羡慕!!!
[manager.requestSerializer setValue:@"XXX" forHTTPHeaderField:@"UserPW"]; [manager.requestSerializer setValue:@"XXX" forHTTPHeaderField:@"UserID"];
但是就是请求不成功,期间也问了一些朋友都说他们也是这样添加的,安卓的也可以请求成功,这就很尴尬了!!!
难道Webservice的SOAP请求这么难?于是就开始查资料,发现还是自己想简单了,SOAP请求不能直接这样添加header(或许也可以,可能我们的情况比较特殊),看下SOAP请求的测试。
SOAP协议实际上就是一种基于XML编码规范的文本协议。目前WebService的协议主要有SOAP1.0、SOAP1.1和1.2(我们用的是1.1)。soap默认POST请求,GET好像不可以,SOAP协议的版本会影响请求是否成功。
SOAP1.1
SOAP1.2
上面框内就是请求头的添加,我们的服务器还加了请求头识别WyxSoapHeader,必须要有这个,不然请求不成功。下面的框内是参数。你还会发现这个两个框内都有一个东西就是:
<WyxSoapHeader xmlns=\"http://www.wincansoft.com/wyxsms\"> <VerifyAppUserPassword xmlns=\"http://www.wincansoft.com/wyxsms\">
这里的WyxSoapHeader上面说了,VerifyAppUserPassword就是接口方法,http://www.wincansoft.com/wyxsms就是命名空间,这些个都是后台给的,没有找他要。
下面我们就要开始按照上面的格式拼接SOAP1.1字符串:举个例子
<?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:Header> <WyxSoapHeader xmlns="http://www.wincansoft.com/wyxsms"> <UserID>xxxx</UserID> <UserPW>xxxx</UserPW> ....(添加更多header) </WyxSoapHeader> </soap:Header> <soap:Body> <AssignSermoBill xmlns="http://www.wincansoft.com/wyxsms"> <iAssignStaffID>XXX</iAssignStaffID> <sAssignDataJson>XXX</sAssignDataJson> ....(添加更多参数) </AssignSermoBill> </soap:Body> </soap:Envelope>
开发的时候,不能每调用一次接口,都写一遍这一大串东西吧,把这个写成一个方法供外部调用就OK啦。首先要封装一个参数生成字符串方法:
+ (NSString *)getParameters:(NSDictionary *)dictionary { NSString *pamateString = @""; NSArray * allkeys = [dictionary allKeys]; for (int i = 0; i < allkeys.count; i++) { NSString * key = [allkeys objectAtIndex:i]; //如果你的字典中存储的多种不同的类型,那么最好用id类型去接受它 id obj = [dictionary objectForKey:key]; NSString *string = [NSString stringWithFormat:@"<%@>%@</%@>\n",key,obj?obj:@"",key]; pamateString = [pamateString stringByAppendingString:string]; } //NSLog(@"pamateString==%@",pamateString); return pamateString; }
再封装SOAP字符串:
+ (NSString *)getSOAPString:(NSString *)parame interface:(NSString *)interf { NSString *soapStr = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<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/\">\n" "<soap:Header>\n" "<WyxSoapHeader xmlns=\"http://www.wincansoft.com/wyxsms\">\n" "<UserID>xxx/UserID>\n" "<UserPW>xxx</UserPW>\n" "</WyxSoapHeader>\n" "</soap:Header>\n" "<soap:Body>\n" "<%@ xmlns=\"http://www.wincansoft.com/wyxsms\">\n" "%@" "</%@>\n" "</soap:Body>\n" "</soap:Envelope>\n",interf,parame,interf]; return soapStr; }
OK,到这里准备工作基本完毕,现在开始请求:
NSString *soapStr = [UIUtils getSOAPString:[UIUtils getParameters:这里是参数字典] interface:@"这里是接口方法"]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 返回NSData manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 设置请求头,也可以不设置,看自己的需求解开注释,一般不需要 //[manager.requestSerializer setValue:@"http://www.wincansoft.com/wyxsms/QueryUserID" forHTTPHeaderField:@"SOAPAction"]; //[manager.requestSerializer setValue:@"51serapp.wincansoft.net" forHTTPHeaderField:@"Host"]; //[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"]; // 这个设置是必须的 [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; // 设置HTTPBody [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error){ return soapStr; }]; [manager POST:URLString parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *dicRes = [NSDictionary dictionaryWithXMLData:responseObject]; NSLog(@"JSON: - %@", dicRes); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];
上面的URLString是请求地址,不知道是啥或没有问后台要,他清楚的。
OK到这里,一个完整的SOAP带有请求头的请求就完成了。
安卓的就简单多了,不需要拼接这些玩意:
直接设置就好了,羡慕!!!
相关文章推荐
- iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求
- iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求
- IOS 使用Http模拟SOAP请求Webservice时内容Unicode编码的实现
- jmeter发送soap请求-webservice接口
- Jmeter发送SOAP请求对WebService接口测试
- iOS WebService SOAP 请求的实现
- IOS AFNetworking3.0 SDImage 网络请求和图片加载
- 使用afnetworking和网络服务接口及soap发送并接收http/https请求:
- python通过http请求发送soap报文进行webservice接口调用
- jmeter发送soap请求进行webservice接口压力测试
- IOS:SOAP(Webservice)请求基于AFN2.6之后
- Jmeter发送SOAP请求对WebService接口测试
- iOS 使用ASIHTTPRequest 发送Webservice请求
- iOS 开发 AFNetworking3.0源码解析(一:结构图/网络请求三次封装/上传下载/网络监测)
- SOAP Webservice用AFNetworking实现请求
- webService 发送soap请求,并解析返回的soap报文
- iOS 为支持ipv6 最新 AFNetWorking 3.0 数据请求基本使用。
- iOS --- AFNetworking3.0网络请求方法封装(自带缓存功能)
- iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求
- iOS 使用AFNetworking 3.0库进行网络请求时,取消单个队列和全部队列的方法(取消网络请求)