iOS webservice接口soap协议调用遇到的问题
这是第一次调webservice的接口,并且后台没太做过移动端的接口,所以遇到了很多让人崩溃的困难。吃一堑长一智,所以这种时候懒得写博客的我就要趁着这股热乎劲把这次的过程记录下来啦~
首先要做的就是,在你的post方法里加上这一段:
//设置路径URL
NSURL * pathUrl = [NSURL URLWithString:url];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:pathUrl];
request.HTTPMethod = @"POST";
// 设置方法名(问后台)
NSString *methodName = @"方法名";
// 设置请求体
NSString *parameterStr =@"";//这里就是要拼接的参数字符串了
for (NSString *key in parameters.allKeys) {//parameters就是参数字典
parameterStr = [NSString stringWithFormat:@"%@<%@>%@</%@>", parameterStr, key, parameters[key], key];
}
NSString *bodyStr = [NSString stringWithFormat:@"<%@ xmlns=\"%@\">%@</%@>",methodName,(这里的是命名空间字符串,命名空间是啥问后台),parameterStr,methodName];
//soapMsg里的都是死的,不用改,就把之前拼好的bodyStr拼进去就行,也就是只有方法名,命名空间和参数这三种变化的地方
NSString * soapMsg = [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>%@</soap:Body></soap:Envelope>",bodyStr];
NSString *soapAction=[NSString stringWithFormat:@"%@%@",WebServiceNameSpace,methodName];
之后~~~大家是不是大多数都是用AFN啊,我也是,我就以AFN为例说一下了。
其实也没啥,之后就是得设置一下AFN的接收类型和请求头,因为我自己看到网上有人说因为没有设置这些出问题的,当然我也出了啊~但是,如果不设置是不是一定会出这些问题我就不知道了,因为我不设出问题了,可是网上有人不设没问题的。
设置接收类型:
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/xml", @"text/html", @"text/plain", nil];
设置请求头:
// 设置请求头
[manager.requestSerializer setValue:[pathUrl host] forHTTPHeaderField:@"Host"];
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];//这里必须设的,不然会报415错误
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapMsg.length] forHTTPHeaderField:@"Content-Length"];
[manager.requestSerializer setValue:soapAction forHTTPHeaderField:@"SOAPAction"];
最后,设置HTTPBody:
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapMsg;
}];
然后就是请求了[manager POST:url parameters:soapMsg progress:^(NSProgress *downloadProgress) {…………………………
番外:
因为如果请求成功了的话返回的是xml,怎么解析嘞?
// 把返回的二进制数据转为字符串
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",result);
// 利用正则表达式取出<return></return>之间的字符串
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(?<=return\\>).*(?=</return)" options:NSRegularExpressionCaseInsensitive error:nil];
NSDictionary *dict = [NSDictionary dictionary];
for (NSTextCheckingResult *checkingResult in [regular matchesInString:result options:0 range:NSMakeRange(0, result.length)]) {
// 得到字典
dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
}
// 请求成功并且结果有值把结果传出去
if (success && dict) {
success(dict);
}
敲黑板!划重点:
以上这些你都设置好了之后,如果请求后出现,你这边请求成功了,后台的方法也走,并且:
1.你这边传的参数后台收到的是null
2.后台报警告:Received WS-I BP non-conformant Unquoted SoapAction
3.后台和安卓调这个接口能收到参数
不要怕,这十有八九就是后台的问题,请把这篇文章【http://www.zhangc.cn/post/74.html】发给你的后台,让他看看再说,然后再试试能不能行。(嘤嘤嘤,就因为第三条我自己上网又是找资料又是各种尝试的,改来改去都觉得我写的没毛病,两天后,可能是上天垂怜,后台有事出去了,把他电脑放我这让我看控制台的打印,这我才发现他报了第二条的警告……,然后我就上网查了,一查就查到了,真是醉了,好了收。我们要互相理解,谁都有犯错的时候,下次注意就行了,让世界充满爱吧~哈哈哈Hhhh.............=)
出现安卓能调通,iOS调不通的原因我也不太清楚了,后端我不太懂,是因为都是Java吗?!
iOS webservice接口soap协议调用遇到的问题的更多相关文章
- C#如何使用Soap协议调用WebService?
WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...
- loadrunner做webservice接口之简单调用
今天听大神讲了webservice做接口,我按照他大概讲的意思自己模拟实战了下,可能还有很多不对,一般使用webservice做接口,会使用到soapui,但是用了loadrunner以后发现lr很快 ...
- Java WebService接口生成和调用 图文详解>【转】【待调整】
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- [置顶]
Java WebService接口生成和调用 图文详解
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- java 调用wsdl的webservice接口 两种调用方式
关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...
- 在ASP.NET Web Application中通过SOAP协议调用Bing搜索服务
本文介绍了如何在ASP.NET Web Application中将Bing搜索作为Web Service来使用,并通过HTTP的SOAP协议在ASP.NET Web Application中调用Bin ...
- iOS webservice 接口使用方法
1.没有参数的webservice 接口,如下: 接口名:获取服务器时间 方法名: getServerTime() 参数:空 返回值:服务器当前时间: yyyy/MM/dd HH:mm:ss 使用方法 ...
- WebService接口定义及调用
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. WebS ...
- 使用HttpClient工具类测试WebService接口(soap)
import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import jav ...
随机推荐
- Ceres-Solver库入门
示例1:求极值 首先我们以Ceres库官网中的Hello World例子来进行说明.这里例子的目的是为了计算方程取得最小值时x的值.从这个方程很容易看出来当x=10时,f(x)取得最小值0.这个方程虽 ...
- CUDA学习,查看device性能参数
#include "../common/book.h" #include< stdio.h> #include "cuda_runtime.h" # ...
- 预装WIN8的电脑是GPT分区模式,无法安装WIN7
本人的笔记本自带的是WIN8系统,现在想安装WIN7的系统,但是安装不了,提示"windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式". 通过上网搜索得知WIN7一般安装 ...
- 安装nodejs中遇到的问题
make clean 出现时间不对的问题的时候,主要是系统时间设置错误. 用date -s 来分别设置日期和时间 用clock -w来写入CMS 安装g++ yum -y install gcc-c+ ...
- Java-ServletContextListener
/** * Implementations of this interface receive notifications about * changes to the servlet context ...
- 机器人操作系统ROS(indigo)与三维仿真软件V-Rep(3.2.1)通信接口使用笔记
关键字:ROS(indigo),V-Rep(3.2.1), vrep_ros_bridge(lagadic). vrep_ros_bridge提供了V-Rep和ROS之间的通信接口,可以实现使用ROS ...
- Android 4.1.2系统添加重启功能
对于Android的的手机或者平板长期使用,感觉会出现慢的情况,所以偶尔还是需要重启一下,而长按电源键弹出的菜单又没有重启选项,所以特在此记录自己添加这个功能的过程. 首先关机的那个弹出菜单是在fra ...
- 在AndroidManifest.xml文件中设置Android程序的启动界面方法
从网上搜集了一堆的Android代码,比如Android的Login程序和Android的Helloworld程序,但是却总不能正确运行一个正确的程序,郁闷了很久,终于在一次一次的测试后成功的在And ...
- How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub
How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub (我是如何拒绝微软30w的诱惑,专注于GitHub事业) 当我老 ...
- node_acl 路径通配
最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...