最近遇到一个需求:要求从客户端传到服务器的参数是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中请求序列化的设置相关推荐

  1. html5下拉列表默认值,element-ui中的select下拉列表设置默认值方法_简单_前端开发者...

    element-ui中的select下拉列表如何设置默认值? 在element-ui的运用中,涉及到了select下拉列表.项目中需要将select的默认值给展示出来 那如何修改呢? 上element ...

  2. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava在SPRING MVC3中,比如做REST时,经常要用JASON去解析,遇到了日期格式化的问题, ...

  3. python客户端修改session_python中flask的Session设置的方法介绍

    本篇文章给大家带来的内容是关于python中flask的Session设置的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是Session? cookie: 客户端浏览 ...

  4. 谈谈:.Net中的序列化和反序列化

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...

  5. 谷歌云请更正这张卡片的信息_如何识别和更正Google Analytics(分析)报告中的(未设置)值

    谷歌云请更正这张卡片的信息 Have you ever noticed the (not set) value instead of actual value in Google Analytics? ...

  6. vue中请求接口怎么封装公共地址_如何修改Vue打包后文件的接口地址配置(转自网络)...

    1.背景 常规的vue项目分为本地环境和生产环境,我们只要对 config 文件夹下的 dev.env.js 和 prod.env.js 做相应的配置即可.但是最近在做的项目中,涉及到私有化部署,就是 ...

  7. 计算机调试致sa登录失败,无法打开登录 'xxxx' 中请求的数据库。登录失败。用户 'sa' 登录失败。解决思路...

    当前位置:我的异常网» Sql Server » 无法打开登录 'xxxx' 中请求的数据库.登录失败.用 无法打开登录 'xxxx' 中请求的数据库.登录失败.用户 'sa' 登录失败.解决思路 w ...

  8. 对象序列化Java中的序列化

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 当两个进程在停止远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都市以二进制序列的情势在络网上传送.发送方需要把这个Java对 ...

  9. go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置

    http中有Get/Post/PostForm方法 也可以通过http包中设置client 请求配置 ,然后通过client.Do方法实现请求 下demo中功能都实现,其中有详细说明: package ...

最新文章

  1. 在自行车论坛看到的有趣帖子
  2. shujufenxi : shenzhenditie
  3. java强制转换_java强制类型转换
  4. python 获得当前运行脚本文件的路径
  5. 关于string转int、float、double常用方法
  6. 查询GC得到森林里主域和子域的帐号
  7. linux ntp时间立即同步命令_如何在 Linux 下确认 NTP 是否同步?
  8. javascript的浏览器Bom详解,window、location、history对象
  9. php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区
  10. python执行效果_使用tqdm显示Python代码执行进度功能
  11. ios沙箱模式开启_【iOS】苹果IAP(内购)中沙盒账号使用注意事项
  12. 论文 计算机网络技术的功能,计算机网络技术在有线电视网络中的作用论文
  13. ask调制流程图_ASK调制及相干解调电路设计.doc
  14. 虚拟麦克风音频输入_Audio Precision 全新声学/音频分析软件可减少测试时间
  15. 第四届“泰迪杯”数据分析技能赛-赛题A:《通讯产品销售和盈利能力分析》报告
  16. 如何爬取B站视频的封面图片
  17. ESP32产品系列之智能插座(二),ESP32代码部分
  18. 国外邮件服务器,在国外发邮件连不上国内的邮件服务器
  19. Facebook加密项目Libra浮出水面,Visa和万事达卡「入伙」
  20. 软件兼容性与软件兼容性测试

热门文章

  1. Spring Cloud(三) 熔断器Hystrix
  2. Java Optional 的 orElse() 和 orElseGet() 的区别
  3. 派生类的友元与析构【C++继承】
  4. php pcntl 进程池_PHP 进程池与轮询调度算法实现多任务的示例代码
  5. keras cnn注意力机制_从发展历史视角解析Transformer:从全连接CNN到Transformer
  6. python玩转android_Android上执行python脚本-QPython
  7. 【收藏】Linux系统常用命令速查手册(附PDF下载链接)
  8. java metapojo_JavaBean,POJO,VO,DTO的区别和联系
  9. 精彩回顾 | Serverless Developer Meetup 12.04 深圳站
  10. 云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践