AFN中请求序列化的设置
最近遇到一个需求:要求从客户端传到服务器的参数是json字符串,于是我本能的用pod装了afn然后进行了request和response Serialization的相关设置
AFHTTPSessionManager *netMnager = [AFHTTPSessionManager manager];
netMnager.requestSerializer = [AFHTTPRequestSerializer serializer];
netMnager.responseSerializer = [AFHTTPResponseSerializer serializer];
[netMnager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *dicJson =@{@"packetHead": @{
@"serviceCode":@"3005",
@"token":@"fdsfdsfsfsf8f8dsfsdfsfsfsfsf0dsf0sdf",
@"sign":@"FHGHGFHFGHFGHGFHGFHGFHFGHF"},
@"packetBody": @{
@"abc":@"你好啊"
}
};
[netMnager POST:@"" parameters:dicJson progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
在我看来一切都是那么的稀疏平常,可是问题就来了,服务器获取到的数据竟然不是json字符串,而是url编码的格式,也就是&key=value的形式,于是我蒙蔽了,好久没遇到过这种问题了,于是请教了下百度和谷歌,最后研究afn源码发现这是afn设置的原因或者说afn内置的原因
简单的解析下上述代码的运行过程:
1.调用POST方法
2.调用底层URLSESSIONDATATASK
3.创建request对象
4.对request对象进行序列化查询
5.调用对应的request方法
6.AFHttpRequest中的方法执行,其中当没有设置序列化方法时,会走默认的序列化方法,在此方法中最后序列化成为urlencode编码格式,问题也出在此处
最后的优化
第一种方法,设置AFJSONRequetSerializer,此方法中参数以json对象的二进制形式传向后台服务器
AFHTTPSessionManager *netMnager = [AFHTTPSessionManager manager];
// netMnager.requestSerializer = [AFHTTPRequestSerializer serializer];
netMnager.requestSerializer = [AFJSONRequestSerializer serializer];
netMnager.responseSerializer = [AFHTTPResponseSerializer serializer];
// [netMnager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// [netMnager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
// NSData *data = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
//
// NSString *jsonstr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"--- %@",jsonstr);
// return jsonstr;
// }];
NSDictionary *dicJson =@{@"packetHead": @{
@"serviceCode":@"3005",
@"token":@"fdsfdsfsfsf8f8dsfsdfsfsfsfsf0dsf0sdf",
@"sign":@"FHGHGFHFGHFGHGFHGFHGFHFGHF"},
@"packetBody": @{
@"pageType":@"你好啊"
}
};
[netMnager POST:@"http://192.168.1.7:8888/testgateway" parameters:dicJson progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"--- %@",[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error = %@",error.userInfo);
}];
第二种,配置request的序列化查询方法,该方法参数以json字符串的二进制流形式传向服务器
AFHTTPSessionManager *netMnager = [AFHTTPSessionManager manager];
netMnager.requestSerializer = [AFHTTPRequestSerializer serializer];
netMnager.responseSerializer = [AFHTTPResponseSerializer serializer];
[netMnager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[netMnager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
NSData *data = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
NSString *jsonstr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"--- %@",jsonstr);
return jsonstr;
}];
NSDictionary *dicJson =@{@"packetHead": @{
@"serviceCode":@"3005",
@"token":@"fdsfdsfsfsf8f8dsfsdfsfsfsfsf0dsf0sdf",
@"sign":@"FHGHGFHFGHFGHGFHGFHGFHFGHF"},
@"packetBody": @{
@"pageType":@"你好啊"
}
};
[netMnager POST:@"http://192.168.1.7:8888/testgateway" parameters:dicJson progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"--- %@",[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error = %@",error.userInfo);
}];
AFN中请求序列化的设置的更多相关文章
- Python的Django REST框架中的序列化及请求和返回
Python的Django REST框架中的序列化及请求和返回 序列化Serialization 1. 设置一个新的环境 在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使 ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置
http中有Get/Post/PostForm方法 也可以通过http包中设置client 请求配置 ,然后通过client.Do方法实现请求 下demo中功能都实现,其中有详细说明: package ...
- .NET中XML序列化的总结
[题外话] 以前虽然常用.NET中的序列化,但是常用的BinaryFormatter,也就是二进制文件的序列化,却鲜用XML的序列化.对于XML序列化,.NET中同样提供了一个非常方便的工具XmlSe ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- jquery.ajax 跨域请求webapi,设置headers
解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 1.第一步 服务端 ...
- UrlConnection doPost Https请求 、编码设置
UrlConnection doPost Https请求 .编码设置 UrlConnection doPost方法 /** * 发送POST请求 * * @param url 请求地址url * @p ...
- MD中bitmap源代码分析--设置流程
1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...
随机推荐
- jsp获取parameter乱码
String StaffName = new String(request.getParameter("StaffName").getBytes("iso-8859-1& ...
- ios应用程序国际化
1.程序名称国际化: 在Xcode中新建项目后,能够在project的info选项卡中找到Localization的项目,能够加入应用程序须要支持的国际语言. 回到项目中能够发如今InfoPlist. ...
- hdu4553约会安排 线段树
//DS QT 找一段最靠前的长度为QT的空间 //NS QT 找一段最靠前的长度为QT的空间.假设没找到能够将DS占领的空间当做空暇空间,找一段最靠前的空间 //STUDY!! L R 清空L ...
- js、jquery实现模糊搜索功能
模糊搜索功能在工作中应用广泛,并且很实用,自己写了一个方法,以后用到的时候可以直接拿来用了! 实现的搜索功能: 1. 可以匹配输入的字符串找出列表中匹配的项,列表框的高度跟随搜索出的列表项的多少改变 ...
- JavaScrpit判断横竖屏
JavaScript function setLandscapeClass(){ if(window.orientation === 90 || window.orientation === -90 ...
- 工作随笔——Golang interface 转换成其他类型
新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...
- Sphinx学习笔记(一)
最近负责一个项目,需要用到全文检索,我的环境大体如下: 1.数据保存在MySQL中 2.需要支持中文检索 3.尽可能的简单 选择了Sphinx,至于solr和E ...
- 【CSS3】浏览器内核、私有前缀
浏览器内核 私有前缀 浏览器 webkit -webkit- chrome.safari.安卓.ios trident -ms- IE gecko -moz- firefox presto -o- o ...
- 【python】for循环
>>> exp='welcom to python'>>> for i in exp: print(i,end=' ') w e l c o m t o p y t ...
- HTTP协议------->资源和URL
1.前言 最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿- 计划用近十篇文章,详尽的说清楚以下一些问题: URL和资源.HTTP报文是什么东西? HTTP是怎样进行链接 ...