AFNetWorking用起来挺方便,但我目前对它的了解基本仅限于简单的数据请求,所以时常碰到各种问题,开个帖子专门整理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:@"参数" 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.字典转json (有些请求的参数要求是json类型)
dic:为参数字典
NSData *data1 = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString * json = [[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];
3.AFNetWorking出现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"。
依据情况和报错添加,-1016应该只需添加@"text/html"。
网上也有说添加以下代码的,暂未尝试过,先记录下。
[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"];