AFNetworking 2.0 добавить заголовки в запрос GET

Я только начал использовать AFNetworking 2.0, и мне было интересно, как я помещал заголовки в запрос HTTP Get. Документация устанавливает GET следующим образом:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];

Но поскольку мы не обрабатываем NSURLRequests, я не уверен, как установить заголовки HTTP.

Любая помощь будет оценена по достоинству.
С уважением,
Mike

Ответ 1

Фантастическая документация для AFNetworking 2.0 делает это немного трудно найти, но она есть. На AFHTTPRequestSerializer находится -setValue:forHTTPHeaderField:.

В качестве альтернативы, если следовать их рекомендуемому подходу к созданию диспетчера сеансов, который происходит от AFHTTPSessionManager, тогда этот класс может переопределить метод для изменения заголовков по каждому запросу -dataTaskWithRequest:completionHandler:. Я использую это для проверки запросов и изменения заголовков в каждом конкретном случае и предпочитаю, чтобы он модифицировал сериализатор, поскольку он несут ответственность за сетевое взаимодействие, содержащееся в этом менеджере (и избегает сбрасывания с одиночными точками).

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler
{
    static NSString *deviceId;
    if(!deviceId)
    {
        deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    }

    NSMutableURLRequest *req = (NSMutableURLRequest *)request;
    // Give each request a unique ID for tracing
    NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ];
    [req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"];
    return [super dataTaskWithRequest:req completionHandler:completionHandler];
}

Ответ 2

Вот пример использования AFNetworking 2.0

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"];

[manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

Ключом являются следующие две строки:

manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];

Ответ 3

добавление ответа и сериализатора запросов решило мою проблему.

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

Ответ 4

Я использовал эту форму, чтобы назначить встречу с определенным заголовком.

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[operationManager POST:url
            parameters:params
               success:^(AFHTTPRequestOperation *operation, id responseObject) {

                   if (success) {
                       success(responseObject);
                   }

               }
               failure:^(AFHTTPRequestOperation *operation, NSError *error) {

                   NSLog(@"Error: %@", [error description]);

               }
 ];

Ответ 5

Вот что я считаю лучшим вариантом. В одном месте где-нибудь, настройте AFHTTPSessionManager с помощью NSURLSessionConfiguration, а затем используйте AFHTTPSessionManager каждый раз, когда вы хотите сделать запрос.

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"};

mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];

Ответ 6

Я сделал это... для тех, кто передает токен

[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];

Ответ 7

Используйте следующий код, чтобы поместить любой тип значения заголовка:

[[FRHTTPReqManager sharedManager].requestSerializer setValue:value forHTTPHeaderField:key];