Заголовок AFHTTPSessionManager

Я пытаюсь установить заголовок по умолчанию для «Content-Type», установив HTTPAdditionalHeaders. Когда я смотрю на заголовок запроса, AFNetworking (v 2.0.3) меняет его обратно. Я также пытался установить заголовок с помощью setValue: forHTTPHeaderField: в requestSerializer, но безуспешно. Что мне не хватает?

ОБНОВЛЕНО

    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");
    }];

person sash    schedule 19.12.2013    source источник
comment
Вы используете AFNetworking 2.0.3?   -  person Aaron Brager    schedule 19.12.2013
comment
да, AFNetworking 2.0.3   -  person sash    schedule 19.12.2013
comment
На что AFNeteworking меняет заголовок типа контента?   -  person Aaron Brager    schedule 19.12.2013
comment
@Aaron Brager, AFNetworking меняет его на application/x-www-form-urlencoded; кодировка = utf-8   -  person sash    schedule 20.12.2013


Ответы (3)


Я думаю, что 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) {

}];
person sash    schedule 20.12.2013
comment
Какова цель uploadTaskWithRequest:fromData:progress:completionHandler: так..? Просто отслеживать прогресс? - person klefevre; 23.06.2014
comment
@ kl94 Я знаю, что это был старый вопрос, но цель uploadTaskWithRequest - создать NSURLSessionUploadTask (который можно использовать в фоновом сеансе, а это нельзя). Но это создает составной запрос, которого uploadTaskWithRequest нет. - person Rob; 10.10.2014
comment
@Rob Спасибо за эту точность - person klefevre; 10.10.2014

AFNetworking поставляется с AFJSONRequestSerializer и AFJSONResponseSerializer:

[manager setRequestSerializer:[[AFJSONRequestSerializer alloc] init]];
[manager setResponseSerializer:[[AFJSONResponseSerializer alloc] init]];
person runmad    schedule 19.12.2013
comment
Мне нужно установить другой Content-Type, а не json. application/json — это просто пример. - person sash; 19.12.2013
comment
на что ты его настраиваешь? Вы выбрали «application/json» в своем вопросе, который также является значением по умолчанию, поэтому я предполагаю, что вы попали в какое-то состояние гонки. - person timpone; 19.12.2013
comment
@timpone Извините, возможно, мой вопрос вводит в заблуждение. Я пытаюсь установить multipart/form-data - person sash; 19.12.2013
comment
y, тогда вам следует обновить вопрос; вероятно, не хотите использовать AFJSONRequestSerializer - person timpone; 19.12.2013
comment
Зачем отрицать этот ответ, если ваш вопрос даже неверен ?! Данный ответ основан на вашем первоначальном вопросе, который относился к application/json без упоминания multipart/form-data. - person runmad; 19.12.2013

В файле AFURLRequestSerialization.m вы можете найти следующее свойство:

@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders;

Теперь вы можете создать подкласс AFHTTPRequestSerializer (или AFJSONRequestSerializer) и добавить желаемые заголовки HTTP в этот изменяемый словарь (не забудьте импортировать файл AFURLRequestSerialization.m в файл сериализатора запроса .m).

Затем вы просто устанавливаете свойство requestSerializer вашего подкласса AFHTTPSessionManager в новый объект вашего нового класса сериализатора запросов (например, в методе init), и все готово. Тогда все запросы к вашему диспетчеру сеансов должны включать ваши HTTP-заголовки.

person Jeehut    schedule 05.08.2014