日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AFN中请求序列化的设置

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中请求序列化的设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。