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 带有AFJSONRequestSerializerAFJSONResponseSerializer

[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

源码分析之AFNetworking ①AFURLSessionManager与AFHTTPSessionManager

AFNetworking 2.0:传递标头信息

AFNetworking 2.0 和请求标头