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);
    }];
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM