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方法

image.png

2.调用底层URLSESSIONDATATASK

image.png

3.创建request对象

image.png

4.对request对象进行序列化查询

image.png

5.调用对应的request方法

image.png

6.AFHttpRequest中的方法执行,其中当没有设置序列化方法时,会走默认的序列化方法,在此方法中最后序列化成为urlencode编码格式,问题也出在此处

image.png

image.png

最后的优化
第一种方法,设置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);
    }];

image.png

第二种,配置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);
    }];
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,242评论 6 13
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,267评论 4 61
  • 文/华华时节 毕业那天 挥手,我们没有 流泪,我们没有 像放假一样 将背影留在转角、路口 没有道一声珍重 我们想着...
    华华时节阅读 312评论 12 11
  • 回家的路 回家,回家。 回家能体验到家乡的小吃, 那些诱人的鸡肉,面条,历历在目。 回家能体验到家乡的变化, 能在...
    朋友你好吗qing阅读 294评论 0 0