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标志.而在下发写请求给磁 ...
随机推荐
- <转> Libvirt学习总结
感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...
- Codeforces 149 E. Martian Strings
正反两遍扩展KMP,维护公共长度为L时.出如今最左边和最右边的位置. . .. 然后枚举推断... E. Martian Strings time limit per test 2 seconds m ...
- 【Jquery系列】JqGrid参数详解
1 概述 本篇文章主要与大家分享JqGrid插件参数问题. 2 参数详解 2.1 初始化参数 2.2 ColModel参数 3 json数据 jqGrid可支持的数据类型:xml.jso ...
- Java二维数组的概念和使用方法
二维数组 数组的数组---二维数组的每一个元素是一个一维数组 定义格式 数据类型[][] 数组名 = new 数据类型[二维数组的长度/包含的一维数组的个数][每个一维数组的长度]; int[][] ...
- MPSOC之2——ubuntu环境配置及petalinux安装
MPSOC的linux开发需要使用petalinux,选择Ubuntu操作系统. 1.Ubuntu 1.1. Ubuntu安装 版本16.04.03 vmare版本:12.0 安装时注意选择" ...
- 用keras做SQL注入攻击的判断
本文是通过深度学习框架keras来做SQL注入特征识别, 不过虽然用了keras,但是大部分还是普通的神经网络,只是外加了一些规则化.dropout层(随着深度学习出现的层). 基本思路就是喂入一堆数 ...
- docker commit使用
我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像 docker自己提供的有commit功能 我们以centos为例,现在我们要在一个裸的centos上面安装v ...
- mac配置java和maven环境变量
1.打开终端: 2.输入命令:sudo vi ~/.bash_profile进入编辑模式: 3.输入开机密码并按两次enter键进入编辑选择项: 4.输入i键进入文件插入模式输入配置信息: 5.按es ...
- python爬虫小结1
先看正则化,正则化就是描述命令和字符切分.查找.筛选等功能的方便方式. http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 一个游戏 ...
- OC学习10——内存管理
1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...