公司后台java用的cxf框架,说是iOS、Android、web客户端都可以通用,但是我还是第一次遇到,所以做的时候遇到了不小的坑。下面总结下我开发中遇到的问题以及解决方案:

  首先,后台提供了一份接口文档,描述称入参以及返回内容都要严格参照JSON格式进行约束。于是我对AFHTTPSessionManager进行了如下操作:

  1.设置请求格式以及接收类型为Json

 //设置请求格式为Json
  self.requestSerializer = [AFJSONRequestSerializer serializer];
//设置返回解析接收类型为Json
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
5  serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/json",@"application/json",nil];
6  self.responseSerializer = serializer;

  然后我尝试解析后台传过来的数据,发现后台无法解析我的入参,提示是“解析到‘{’标识的时候遇到了错误”。后台提示我要不让我把“{}”去掉试试,还是失败。然后又提示我是不是没有UTF-8转码,转了之后还是报错。尝试了种种后,后台使用SoapUI工具把他发的请求与响应展示我看了下。对,是SOAP!原来所说的JSON格式是在SOAP协议包裹里的JSON格式,所以其实是XML包JSON的格式收发请求与响应的。利用SOAPUI工具我拿到了SOAP协议的XML通用格式:

 soapMsg = [NSString stringWithFormat:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.%@.xzb.com/\">"
"<soapenv:Header/>"
"<soapenv:Body>"
"<ser:%@>"
"<arg0>%@</arg0>"
"</ser:%@>"
"</soapenv:Body>"
"</soapenv:Envelope>",serPre,action,[self dictionaryToJson:arguDict],action];//这里将我用到的参数传了进去

当然还有字典转JSON字符串的方法:

- (NSString*)dictionaryToJson:(NSDictionary *)dic

{
NSError *parseError = nil;
if (dic == nil) {
return nil;
}
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

完整封装MutableRequest的方法如下:

- (NSMutableURLRequest *)SOAPWithService:(NSString *)service action:(NSString *)action arguDict:(NSDictionary *)arguDict
{
//这里service是指后台写的服务名称,action表示服务下具体的某个方法:比如:sysService/queryLocation 系统服务下的,查询地理信息方法
NSURL *url = [NSURL URLWithString:BASEURL(service)];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *soapMsg = @""; if (arguDict != nil) { soapMsg = [NSString stringWithFormat:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.%@.xzb.com/\">"
"<soapenv:Header/>"
"<soapenv:Body>"
"<ser:%@>"
"<arg0>%@</arg0>"
"</ser:%@>"
"</soapenv:Body>"
"</soapenv:Envelope>",serPre,action,[self dictionaryToJson:arguDict],action];
}else{ //由于没有参数和有参数时XML有点不同,所以这里进行了区分
soapMsg = [NSString stringWithFormat:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.%@.xzb.com/\">"
"<soapenv:Header/>"
"<soapenv:Body>"
"<ser:%@/>"
"</soapenv:Body>"
"</soapenv:Envelope>",serPre,action];
}
NSString *soapLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMsg length]]; [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request addValue:soapLength forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval:];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
return request;
}

接着用sessionManager发请求就好了

 AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

 NSURLSessionDataTask *task = [mgr.session dataTaskWithRequest:[self SOAPWithService:service action:action arguDict:arguDict] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {         //解析数据,利用回调block把数据传出去
}]; [task resume];

ps.SOAP协议是基于POST请求的,所以全部都是用POST进行请求的。

iOS交互WebService(cxf框架)的更多相关文章

  1. WebService之CXF框架

    本文主要包括以下内容 ant工具的使用 利用cxf实现webservice cxf与spring整合 ajax访问webservice ant 工具 1.为什么要用到ant这个工具呢? Ant做为一种 ...

  2. webservice第三篇【接口开发webservice、CXF框架使用、IDEA下使用webservice、小例子】

    实现接口的webservice 服务端 import javax.jws.WebService; /**面向接口的webservice发布方式 * * */ @WebService public in ...

  3. 分布式架构探索 - 2. WebService RPC框架之Apache CXF

    Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...

  4. webservice的简单使用,cxf框架的的使用

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...

  5. 转载 WebService 的CXF框架 WS方式Spring开发

    WebService 的CXF框架 WS方式Spring开发   1.建项目,导包. 1 <project xmlns="http://maven.apache.org/POM/4.0 ...

  6. WebService系列二:使用JDK和CXF框架开发WebService

    一.使用JDK开发WebService 服务端程序创建: 1.新建一个JDK开发webservice的服务端maven项目JDKWebServiceServer 2. 定义一个接口,使用@WebSer ...

  7. Webservice与CXF框架快速入门

    1. Webservice Webservice是一套远程调用技术规范 远程调用RPC, 实现了系统与系统进程间的远程通信.java领域有很多可实现远程通讯的技术,如:RMI(Socket + 序列化 ...

  8. cxf 框架 webservice

    cxf 内置了一个web服务器 cxf简单入门实例 package test; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import c ...

  9. 项目一:第六天 WebService写接口 和CXF框架

    1 课程计划 1. webService入门(了解) 2. 基于jdk1.7开发webservice服务(了解) 3. Apache CXF框架入门(掌握) 4. 基于CXF框架搭建CRM系统(掌握) ...

随机推荐

  1. API -- java.lang.Integer

    java.lang Class Integer static Integer valueOf(int i) Returns an Integer instance representing the s ...

  2. [转]Python os.path模块

    os.path模块 原文链接:http://my.oschina.net/cuffica/blog/33494 basename('文件路径')    去掉目录路径,返回fname文件名 import ...

  3. WSB功能分解(在线考试系统)

    对在线考试系统进行WSB功能分解至三级子功能,并且预估每个子功能所需时间. 一级功能 二级功能 三级功能 预估花费时间(小时) 考试管理员功能模块 培训计划 查询 1.5 重置 1 新增计划 1.5 ...

  4. OpenBSD内核之引导PBR

    OpenBSD引导的第二部PBR,也是活动分区的一个扇区的代码,由第一步的MBR加载到0x7C00处,manpage里详细的讲解了过程和大致实现 biosboot(8) (http://man.ope ...

  5. Balanced Binary Tree [LeetCode]

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  6. BZOJ3143 [Hnoi2013]游走

    首先高斯消元解出每个点被走到的概率 注意到这里走到$n$就停下来了,所以$P(n) = 0$ 解出来以后,给每条边$(u, v)$赋边权$P(u) + P(v)$即可,然后直接贪心 /******** ...

  7. F2工作流引擎参与者类型成员的交、并、互拆计算规则

          计算描述:计算规则指的是和其它“参与者类型成员”的之间的计算,必须求解处理人不为空的情况下才进行规则计算,各个“参与者类型成员”按序号顺序执行. 计算算法:并集(权重最低),交集(权重中) ...

  8. hadoop3.0 alpha1 安装配置

    1. 官网下载 wget  http://apache.fayea.com/hadoop/common/hadoop-3.0.0-alpha1/hadoop-3.0.0-alpha1.tar.gz 2 ...

  9. hello 漂亮的小靓仔

    <form type="text" name="超级" method="post"> <table align=" ...

  10. .htacess的url重写(支持伪静态)

    html网页纯静态: 1.加载的时候不需要调用数据库,打开速度快,另外减少了服务端脚本的匹配时间.2.减少了服务器对数据响应的负荷.3.从安全角度讲,纯静态网页不易遭受黑客攻击.4.从网站稳定性来讲, ...