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];