AFNetworking 2.0 и базовая аутентификация HTTP
Не удается найти AFHTTPClient в AFNetworking 2.0, чтобы использовать:
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com]];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];
Как это нужно управлять на AFNetworking 2.0?
3 ответа
Новая архитектура AFNetworking 2.0 использует сериализаторы для создания запросов и анализа ответов. Чтобы установить заголовок авторизации, вы должны сначала инициализировать диспетчер операций запроса, который заменяет AFHTTPClient, создать сериализатор, а затем вызвать специальный метод для установки заголовка.
Например, ваш код станет:
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com"]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"];
Вы должны прочитать документацию и руководство по миграции, чтобы понять новые концепции, которые идут с версией 2.0 AFNetworking.
Вот пример выполнения базовой HTTP-аутентификации с AFNetworking 2.0 с использованием NSURLCredential. Преимущество этого подхода перед использованием AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password:
Метод заключается в том, что вы можете автоматически сохранить имя пользователя и пароль в цепочке для ключей, изменив persistence:
параметр NSURLCredential. (Смотрите этот ответ.)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSURLCredential *credential = [NSURLCredential credentialWithUser:@"user" password:@"passwd" persistence:NSURLCredentialPersistenceNone];
NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:@"https://httpbin.org/basic-auth/user/passwd" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCredential:credential];
[operation setResponseSerializer:[AFJSONResponseSerializer alloc]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", error);
}];
[manager.operationQueue addOperation:operation];
Как упоминает @gimenete, многочастные запросы не будут выполняться при использовании подхода учетных данных @titaniumdecoy, так как он применяется в блоке вызова, и в текущей версии AFNetworking есть проблема с этим. Вместо использования учетных данных вы можете встроить аутентификацию в заголовок NSMutableRequest.
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT" URLString:path parameters:myParams constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
[formData appendPartWithFileData:imageData name:imageName fileName:imageName mimeType:@"image/jpeg"];
} error:&error];
NSString *authStr = [NSString stringWithFormat:@"%@:%@", [self username], [self password]];
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
Где вам нужно будет использовать стороннюю библиотеку кодирования BASE64, такую как NSData+Base64.h и файл.m из решения Matt Gallaghers pre ARC BASE64