这是第一次调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协议调用遇到的问题的更多相关文章

  1. C#如何使用Soap协议调用WebService?

    WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...

  2. loadrunner做webservice接口之简单调用

    今天听大神讲了webservice做接口,我按照他大概讲的意思自己模拟实战了下,可能还有很多不对,一般使用webservice做接口,会使用到soapui,但是用了loadrunner以后发现lr很快 ...

  3. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  4. [置顶] Java WebService接口生成和调用 图文详解

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  5. java 调用wsdl的webservice接口 两种调用方式

    关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...

  6. 在ASP.NET Web Application中通过SOAP协议调用Bing搜索服务

    本文介绍了如何在ASP.NET Web Application中将Bing搜索作为Web Service来使用,并通过HTTP的SOAP协议在ASP.NET Web Application中调用Bin ...

  7. iOS webservice 接口使用方法

    1.没有参数的webservice 接口,如下: 接口名:获取服务器时间 方法名: getServerTime() 参数:空 返回值:服务器当前时间: yyyy/MM/dd HH:mm:ss 使用方法 ...

  8. WebService接口定义及调用

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. WebS ...

  9. 使用HttpClient工具类测试WebService接口(soap)

    import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import jav ...

随机推荐

  1. (二十六)静态单元格(Cell)

    制作类似iOS系统设置的页面,如果使用代码来实现,将会比较麻烦,可以通过静态单元格技术方便的实现. 注意:静态单元格只支持TableViewController. 可以通过storyboard直接操作 ...

  2. Android开发你不知道的TIPS

    1.Space space是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域.这是一个轻量级的视图组件,它可以跳过Draw,对于需要占位符的任何场景来说都 ...

  3. HibernateTemplate 查询原生sql及ljava.lang.object cannot be cast to

    /** * 使用sql语句进行查询操作 * @param sql * @return */ public List queryWithSql(final String sql){ List list ...

  4. Working with bounded Task Flows

      Working with Bounded Task Flows, Regions and Routers in JDeveloper 11g Purpose In this tutorial, y ...

  5. 【UML 建模】UML建模语言入门 -- 用例视图详解 用例视图建模实战

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. 用例视图概述 用例视图表述哪些 ...

  6. html5 jqueryrotate插件实现旋转动画

    CSS3 提供了多种变形效果,比如矩阵变形.位移.缩放.旋转和倾斜等等,让页面更加生动活泼有趣,不再一动不动.然后 IE10 以下版本的浏览器不支持 CSS3 变形,虽然 IE 有私有属性滤镜(fil ...

  7. SharePoint 解决方案手动打包简单介绍

    介绍:在使用SharePoint中,我们经常需要做的就是打包解决方案,我们来介绍下SharePoint解决方案的手动部署,我自己觉得,解决方案是SharePoint中非常好的一个功能,部署和使用起来相 ...

  8. PHP基本的语法结构

    学过C语言的话,上手PHP语言就非常快了,如果你有bash shell的基础,那恭喜你,上手PHP会更快,我们先来了解一下一些比较简单的东西,界定符和注释在PHP中的写法: 一 php文档的语法结构 ...

  9. java多继承

    众所周知,java面向对象语言中只有单继承的编程语言,也许你会说,通过实现多个接口这种变通的方式达到多继承的目的.没错,你说的对,不过这并不是本片文章要说到的内容,本文要讲到的内容是java中实实在在 ...

  10. webpack基础

    首先我们需要手动创建webpack.config.js文件 然后在文件中配置选项 //webpack的配置选项 //__dirname:当前文件所在的目录路径 const config ={ //入口 ...