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系统(掌握) ...
随机推荐
- python虚拟环境
sudo apt-get install python-virtualenv virtualenv --no-site-packages files cd files source ./bin/act ...
- js节点操作
在看<javascript高级程序设计>,看到节点操作这一块,觉得我只知道用appendChild(),太肤浅了,记录下学到的东西. 每个节点都有一个 parentNode 属性,该属性指 ...
- Asp.net有关访问页面权限的限制和错误页面配置
一.访问页面权限的限制 一个小项目,涉及到用户登录. 在用户没登录访问内容也时,对页面做一定限制,没登录的则不能访问,直接跳转到登录界面. /// <summary> /// 对没有登录用 ...
- linux进程通信之使用匿名管道进行父子进程通信
管道:是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件. 管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起 ...
- 《精通C#》第十二章 Linq
Linq是在.Net3.5之后首次引入的,这种查询语言简单易学,可用范围非常广泛在学着之前,一直用在数据库操作之上,但是在学习这节课之后才发现,凡是实现泛型的接口类型都可以使用linq,简单来说就是实 ...
- sass2:
ass学习笔记2 今天介绍sass在重用代码时最具威力的两个功能.一个是嵌套(Nesting),一个混合(Mixin). 我们在写CSS通过需要多个后代选择器组合到一起才能定位到目标元素上,而这定义过 ...
- 遇到bug怎么办
最近第一个完整的项目的第一期快完成了.期间,我怀疑过无数次人生,给难兄难弟辣椒相互吐槽过.被我师父点播后觉得人和人差距怎么可以这么大数次. 终于!基本功能实现了. 今天不总结具体问题了,说一下调试过程 ...
- SpringMVC Model
处理模型数据 ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据. @ModelAttribute:方法入参标注了该注解后,入参对象会放到数据模 ...
- 安装Linux Mint
1.尽量选择trusty的安装版本,kde和xfce不支持Win+..快捷键,推荐cinnamon:制作安装U盘后,选择非EFI模式启动:选择start Linux Mint(就是第一项): 2.In ...
- IOS开发_中遍历数组的方法及比较
数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正. 话不多说直接进入主题 首先创建一个数组 ...