生活随笔
收集整理的這篇文章主要介紹了
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中请求序列化的设置的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。