AFHTTPSessionManager 标头
Posted
技术标签:
【中文标题】AFHTTPSessionManager 标头【英文标题】:AFHTTPSessionManager header 【发布时间】:2013-12-19 15:59:57 【问题描述】:我正在尝试通过设置 HTTPAdditionalHeaders 为“Content-Type”设置默认标头。当我查看请求标头时,AFNetworking (v 2.0.3) 将其改回。我还尝试在 requestSerializer 上通过 setValue:forHTTPHeaderField: 设置标头,但没有成功。我错过了什么?
更新
NSURL *URL = [NSURL URLWithString:@"http://example.com/api"];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.HTTPAdditionalHeaders = @@"Content-Type": @"multipart/form-data";
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:URL sessionConfiguration:configuration];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
[params setValue:@"some value" forKey:@"someKey"];
[manager POST:@"search" parameters:params success:^(NSURLSessionDataTask *task, id responseObject)
NSLog(@"success");
failure:^(NSURLSessionDataTask *task, NSError *error)
NSLog(@"error");
];
【问题讨论】:
您使用的是 AFNetworking 2.0.3 吗? 是的,AFNetworking 2.0.3 AFNeteworking 将 content-type 标头改回什么? @Aaron Brager,AFNetworking 将其更改为“application/x-www-form-urlencoded; charset=utf-8” 【参考方案1】:我认为 AFNetworking 自动设置 Content-Type 并且您无法更改它。使用 Content-Type multipart/form-data 发送数据:
NSURL *URL = [NSURL URLWithString:@"http://example.com/api"];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:URL sessionConfiguration:configuration];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
[params setValue:@"some value" forKey:@"someKey"];
[manager POST:@"search" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
//If you need to send image
UIImage *image = [UIImage imageNamed:@"my_image.jpg"];
[formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5) name:@"Image" fileName:@"my_image.jpg" mimeType:@"image/jpeg"];
success:^(NSURLSessionDataTask *task, id responseObject)
failure:^(NSURLSessionDataTask *task, NSError *error)
];
【讨论】:
uploadTaskWithRequest:fromData:progress:completionHandler: so..的目的是什么?只是跟踪进度? @kl94 我知道这是一个老问题,但uploadTaskWithRequest
的目的是创建一个NSURLSessionUploadTask
(可以在后台会话中使用,而这不能)。但这会创建多部分请求,uploadTaskWithRequest
不会。
@Rob 谢谢你的精确【参考方案2】:
AFNetworking 带有AFJSONRequestSerializer
和AFJSONResponseSerializer
:
[manager setRequestSerializer:[[AFJSONRequestSerializer alloc] init]];
[manager setResponseSerializer:[[AFJSONResponseSerializer alloc] init]];
【讨论】:
我需要设置不同的“Content-Type”,而不是 json。 “application/json”只是一个例子。 你把它设置成什么?您在问题中选择了“应用程序/json”,这也恰好是默认设置,所以我假设您遇到了一些竞争条件。 @timpone 对不起,也许我的问题具有误导性。我正在尝试设置“multipart/form-data” y,你应该更新问题;可能不想使用 AFJSONRequestSerializer 如果您的问题甚至都不正确,为什么要否决这个答案?!给出的答案是基于您与application/json
相关的原始问题,没有提及multipart/form-data
。【参考方案3】:
在AFURLRequestSerialization.m
文件中,您可以找到以下属性:
@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders;
现在您可以继承 AFHTTPRequestSerializer
(或 AFJSONRequestSerializer
)并将所需的 HTTP 标头添加到该可变字典(不要忘记在您的请求序列化程序 .m 文件中导入 AFURLRequestSerialization.m
文件)。
然后,您只需将 AFHTTPSessionManager
子类的 requestSerializer
属性设置为新请求序列化程序类的新对象(例如,在 init
方法中),您就完成了。会话管理器的所有请求都应包含您的 HTTP 标头。
【讨论】:
以上是关于AFHTTPSessionManager 标头的主要内容,如果未能解决你的问题,请参考以下文章
AFHTTPSessionManager 上的 setDataTaskWillCacheResponseBlock 设置的块永远不会被调用
源码分析之AFNetworking ①AFURLSessionManager与AFHTTPSessionManager
源码分析之AFNetworking ①AFURLSessionManager与AFHTTPSessionManager