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系统(掌握) ...
随机推荐
- Java双循环break的用法
break只跳出当前循环,也就是内循环,如果想跳出外循环有两种办法:1:for(int i = 0;i<9;i++){ //用两个breakfor(int j = 0;j<8;j++){b ...
- url的内容及格式
url的内容及结构: url格式:
- OpenBSD内核之引导MBR
MBR的介绍网上很多,没错,就那个最后以0x55AA结尾的512字节的引导块,OpenBSD提供了引导MBR实现:OpenBSD在x86上的引导过程为MBR --> PBR --> boo ...
- (C# & Unity) 脚本语言 ES
C# 编写,解释执行,语法类似 JS,动态类型,支持闭包,支持热更新,效率比较低,目前暂时没有发现 BUG,实际游戏运行稳定,没有发现内存泄漏 Github:https://github.com/ea ...
- Selenium VS QTP
Selenium系列 QTP 适用结构 B/S结构 C/S.B/S结构 适用人员 有一定代码基础(Java.C#.Python.Ruby) 对编程不是很熟悉的.厌烦了做手工功能测试的.想快速进 ...
- cocoapods Analyzing dependencies 问题的解决方案
pod install --verbose --no-repo-update pod update --verbose --no-repo-update 修改就ok了
- 【基本技能篇】>>第3篇《暗时间_指导学习的方法论——心得》
暗时间——指导学习的方法论 ——2016年2月11日 打造自己的核心竞争力:①专业领域技能:②跨领域的技能(解决问题的能力,创新思维,判断与决策能力,表达沟通能力等等):③学习能力,持续学习和思考新知 ...
- ARM: STM32F7: hardfault caused by unaligned memory access
ARM: STM32F7: hardfault caused by unaligned memory access ARM: STM32F7: 由未对齐的内存访问引起的hardfault异常 Info ...
- 三:关于tcp
转自:http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深 ...
- Thymeleaf+Spring整合
前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是SpringMvc框架. 注意Thymeleaf支持同Spring框架的3.和4.版本的集成,但是这两个版本的支持是封装在thym ...