iOS交互WebService(cxf框架)
公司后台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框架)的更多相关文章
- WebService之CXF框架
本文主要包括以下内容 ant工具的使用 利用cxf实现webservice cxf与spring整合 ajax访问webservice ant 工具 1.为什么要用到ant这个工具呢? Ant做为一种 ...
- webservice第三篇【接口开发webservice、CXF框架使用、IDEA下使用webservice、小例子】
实现接口的webservice 服务端 import javax.jws.WebService; /**面向接口的webservice发布方式 * * */ @WebService public in ...
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...
- webservice的简单使用,cxf框架的的使用
Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...
- 转载 WebService 的CXF框架 WS方式Spring开发
WebService 的CXF框架 WS方式Spring开发 1.建项目,导包. 1 <project xmlns="http://maven.apache.org/POM/4.0 ...
- WebService系列二:使用JDK和CXF框架开发WebService
一.使用JDK开发WebService 服务端程序创建: 1.新建一个JDK开发webservice的服务端maven项目JDKWebServiceServer 2. 定义一个接口,使用@WebSer ...
- Webservice与CXF框架快速入门
1. Webservice Webservice是一套远程调用技术规范 远程调用RPC, 实现了系统与系统进程间的远程通信.java领域有很多可实现远程通讯的技术,如:RMI(Socket + 序列化 ...
- cxf 框架 webservice
cxf 内置了一个web服务器 cxf简单入门实例 package test; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import c ...
- 项目一:第六天 WebService写接口 和CXF框架
1 课程计划 1. webService入门(了解) 2. 基于jdk1.7开发webservice服务(了解) 3. Apache CXF框架入门(掌握) 4. 基于CXF框架搭建CRM系统(掌握) ...
随机推荐
- API -- java.lang.Integer
java.lang Class Integer static Integer valueOf(int i) Returns an Integer instance representing the s ...
- [转]Python os.path模块
os.path模块 原文链接:http://my.oschina.net/cuffica/blog/33494 basename('文件路径') 去掉目录路径,返回fname文件名 import ...
- WSB功能分解(在线考试系统)
对在线考试系统进行WSB功能分解至三级子功能,并且预估每个子功能所需时间. 一级功能 二级功能 三级功能 预估花费时间(小时) 考试管理员功能模块 培训计划 查询 1.5 重置 1 新增计划 1.5 ...
- OpenBSD内核之引导PBR
OpenBSD引导的第二部PBR,也是活动分区的一个扇区的代码,由第一步的MBR加载到0x7C00处,manpage里详细的讲解了过程和大致实现 biosboot(8) (http://man.ope ...
- Balanced Binary Tree [LeetCode]
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- BZOJ3143 [Hnoi2013]游走
首先高斯消元解出每个点被走到的概率 注意到这里走到$n$就停下来了,所以$P(n) = 0$ 解出来以后,给每条边$(u, v)$赋边权$P(u) + P(v)$即可,然后直接贪心 /******** ...
- F2工作流引擎参与者类型成员的交、并、互拆计算规则
计算描述:计算规则指的是和其它“参与者类型成员”的之间的计算,必须求解处理人不为空的情况下才进行规则计算,各个“参与者类型成员”按序号顺序执行. 计算算法:并集(权重最低),交集(权重中) ...
- hadoop3.0 alpha1 安装配置
1. 官网下载 wget http://apache.fayea.com/hadoop/common/hadoop-3.0.0-alpha1/hadoop-3.0.0-alpha1.tar.gz 2 ...
- hello 漂亮的小靓仔
<form type="text" name="超级" method="post"> <table align=" ...
- .htacess的url重写(支持伪静态)
html网页纯静态: 1.加载的时候不需要调用数据库,打开速度快,另外减少了服务端脚本的匹配时间.2.减少了服务器对数据响应的负荷.3.从安全角度讲,纯静态网页不易遭受黑客攻击.4.从网站稳定性来讲, ...