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);}];
转载于:https://www.cnblogs.com/tig666666/p/7793180.html
AFN中请求序列化的设置相关推荐
- html5下拉列表默认值,element-ui中的select下拉列表设置默认值方法_简单_前端开发者...
element-ui中的select下拉列表如何设置默认值? 在element-ui的运用中,涉及到了select下拉列表.项目中需要将select的默认值给展示出来 那如何修改呢? 上element ...
- spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava
spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava在SPRING MVC3中,比如做REST时,经常要用JASON去解析,遇到了日期格式化的问题, ...
- python客户端修改session_python中flask的Session设置的方法介绍
本篇文章给大家带来的内容是关于python中flask的Session设置的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是Session? cookie: 客户端浏览 ...
- 谈谈:.Net中的序列化和反序列化
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...
- 谷歌云请更正这张卡片的信息_如何识别和更正Google Analytics(分析)报告中的(未设置)值
谷歌云请更正这张卡片的信息 Have you ever noticed the (not set) value instead of actual value in Google Analytics? ...
- vue中请求接口怎么封装公共地址_如何修改Vue打包后文件的接口地址配置(转自网络)...
1.背景 常规的vue项目分为本地环境和生产环境,我们只要对 config 文件夹下的 dev.env.js 和 prod.env.js 做相应的配置即可.但是最近在做的项目中,涉及到私有化部署,就是 ...
- 计算机调试致sa登录失败,无法打开登录 'xxxx' 中请求的数据库。登录失败。用户 'sa' 登录失败。解决思路...
当前位置:我的异常网» Sql Server » 无法打开登录 'xxxx' 中请求的数据库.登录失败.用 无法打开登录 'xxxx' 中请求的数据库.登录失败.用户 'sa' 登录失败.解决思路 w ...
- 对象序列化Java中的序列化
首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 当两个进程在停止远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都市以二进制序列的情势在络网上传送.发送方需要把这个Java对 ...
- go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置
http中有Get/Post/PostForm方法 也可以通过http包中设置client 请求配置 ,然后通过client.Do方法实现请求 下demo中功能都实现,其中有详细说明: package ...
最新文章
- 在自行车论坛看到的有趣帖子
- shujufenxi : shenzhenditie
- java强制转换_java强制类型转换
- python 获得当前运行脚本文件的路径
- 关于string转int、float、double常用方法
- 查询GC得到森林里主域和子域的帐号
- linux ntp时间立即同步命令_如何在 Linux 下确认 NTP 是否同步?
- javascript的浏览器Bom详解,window、location、history对象
- php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区
- python执行效果_使用tqdm显示Python代码执行进度功能
- ios沙箱模式开启_【iOS】苹果IAP(内购)中沙盒账号使用注意事项
- 论文 计算机网络技术的功能,计算机网络技术在有线电视网络中的作用论文
- ask调制流程图_ASK调制及相干解调电路设计.doc
- 虚拟麦克风音频输入_Audio Precision 全新声学/音频分析软件可减少测试时间
- 第四届“泰迪杯”数据分析技能赛-赛题A:《通讯产品销售和盈利能力分析》报告
- 如何爬取B站视频的封面图片
- ESP32产品系列之智能插座(二),ESP32代码部分
- 国外邮件服务器,在国外发邮件连不上国内的邮件服务器
- Facebook加密项目Libra浮出水面,Visa和万事达卡「入伙」
- 软件兼容性与软件兼容性测试
热门文章
- Spring Cloud(三) 熔断器Hystrix
- Java Optional 的 orElse() 和 orElseGet() 的区别
- 派生类的友元与析构【C++继承】
- php pcntl 进程池_PHP 进程池与轮询调度算法实现多任务的示例代码
- keras cnn注意力机制_从发展历史视角解析Transformer:从全连接CNN到Transformer
- python玩转android_Android上执行python脚本-QPython
- 【收藏】Linux系统常用命令速查手册(附PDF下载链接)
- java metapojo_JavaBean,POJO,VO,DTO的区别和联系
- 精彩回顾 | Serverless Developer Meetup 12.04 深圳站
- 云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践