AFNetWorking用起來挺方便潮峦,但我目前對它的了解基本僅限于簡單的數(shù)據(jù)請求或舞,所以時常碰到各種問題,開個帖子專門整理AFNetWorking遇到的問題蔼囊,算作筆記焚志。
1. 添加RAW請求頭
具體操作:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setResponseSerializer:[AFJSONResponseSerializer serializer]];
[manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
[manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
后面就是正常的manager的post請求就可以了。
[manager POST:@"地址連接" parameters:@"參數(shù)" progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {
NSLog(@"請求成功畏鼓!");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失斀闯辍!");
}];
這里遇到一個坑
manager.requestSerialize = [AFJSONRequestSerializer serializer];
用點語法賦值的時候崩潰在AFN的類里了云矫。
不知道是不是當時還有哪里寫錯了膳沽,有空會再測一下。
2.字典轉(zhuǎn)json (有些請求的參數(shù)要求是json類型)
dic:為參數(shù)字典
NSData *data1 = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString * json = [[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];
3.AFNetWorking出現(xiàn)code=-1016錯誤:Request failed: unacceptable content-type: text/html
解決方法:
在AFNetWorking中找到" AFURLResponseSerialization.m ", 然后在200查找下面代碼(我目前查找到的是在228行)
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
將這句替換成為下面這句:
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];
這句是添加了兩種類型:@"text/plain"和@"text/html"让禀。
依據(jù)情況和報錯添加挑社,-1016應該只需添加@"text/html"。
網(wǎng)上也有說添加以下代碼的巡揍,暫未嘗試過痛阻,先記錄下。
[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
4.AFNetWorking設置超時時間
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setResponseSerializer:[AFJSONResponseSerializer serializer]];
[manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
// 設置超時時間
[manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
manager.requestSerializer.timeoutInterval = 20.f;
[manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];