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标志.而在下发写请求给磁 ...
随机推荐
- String.prototype.trim
/*内置对象添加方法:String.prototype.trim(给String添加一个trim方法) *^这个是以什么什么开头 *$这个是以什么什么结尾 *'/s是String /d是数字' *re ...
- Oracle中主键、外键、索引、序列、唯一性约束的创建
1.主键的创建 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length] constraint pk_name primary ke ...
- Java方法的概念及使用
方法 将一段逻辑或者功能提取出来,这种提取的形式就是函数 格式 修饰符 返回值类型 函数名(参数列表){ 方法体: return 返回值; } //明确返回值类型---求两个整数的和,确定结果一定是整 ...
- Shell编程之文本处理
cut 截取自定列 可以按照某个字符进行分割,然后取出其中的指定列: [root@iz8vbbqbnh4ug2q9so5jflz logs]# --.txt /Dec/::: +] - /Dec/:: ...
- 【十九】require和include的区别
1.require是一个函数,include是一个关键字 2.require是无返回值,include有返回值 3.include()会产生一个警告,而require()则导致一个致命的错误(出现错误 ...
- Android 开发,你遇上 Emoji 头疼吗?
在 Android 中,如果需要使用的到 Emoji 表情,你会发现在某些设备上,有一些 Emoji 表情会被以豆腐块 "☐" 的形式显示,这是因为当前设备并不支持这个 Emoji ...
- Android 环境搭建、基础窗口window/Mac
1.五步搞定Android开发环境部署--非常详细的Android开发环境搭建教程 2.Android开发学习之路--MAC下Android Studio开发环境搭建 4.Android常用开发工具以 ...
- iOS知识点、面试题 之三
最近面试,发现这些题 还不错,与大家分享一下,分三文给大家: 当然Xcode新版本区别,以及iOS新特性 Xcode8 和iOS 10 在之前文章有发过,感兴趣的可以查阅: http://www.cn ...
- Android Weekly Notes Issue #288
Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...
- Vue入门总结
技术栈:VUE:Vue-router:Vue-resource:Vue-cli: 项目:个人博客vue重构 一.vue-cli脚手架搭建项目结构 全局安装vue-cli: npm install vu ...