2013-09-30 3 views
44

Не можете найти AFHTTPClient на AFNetworking 2,0, использовать:AFNetworking 2,0 и HTTP Basic Authentication

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com]]; 

[client setAuthorizationHeaderWithUsername:@"username" password:@"password"]; 

Как это должно быть управление на AFNetworking 2.0?

ответ

94

AFNetworking 2.0 новая архитектура использует сериализаторы для создания запросов и парсинга ответов. Чтобы установить заголовок авторизации, сначала необходимо инициализировать диспетчер операций запроса, который заменяет AFHTTPClient, создайте сериализатор и затем вызовите выделенный метод для установки заголовка.

Например, вы код стал бы:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com"]]; 
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"]; 

Вы должны прочитать documentation и migration guide понять новые концепции, которые приходят с версией 2.0 AFNetworking.

+2

См. Также свойство 'credential' в [' AFHTTPRequestOperationManager'] (http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPRequestOperationManager.html#//api/name/credential) –

+0

Спасибо Дэвиду, первый метод не работал для меня. – Legoless

+1

Может подтвердить, что свойство учетных данных не работает. Игнорирует все, что назначено. – Michael

15

Ниже приведен пример выполнения базовой HTTP-аутентификации с использованием AFNetworking 2.0 с использованием NSURLCredential. Преимущество этого подхода в использовании метода AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password: заключается в том, что вы можете автоматически сохранить имя пользователя и пароль в цепочке ключей, изменив параметр persistence: NSURLCredential. (См this answer.)

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

довольно удобно, спасибо. – EmilDo

+4

Это работало для меня для некоторых запросов. Но неудачи с множественными запросами были вызваны ошибкой «поток тела запроса». Я не уверен без дальнейшего расследования, но я думаю, что ваше решение делает один запрос, ждет ответ 401 и затем повторяет запрос с указанными учетными данными. Таким образом, множественные запросы терпят неудачу, потому что поток не может быть повторно воспроизведен. См. Аналогичную проблему в AFNetworking 1.x https://github.com/AFNetworking/AFNetworking/issues/661 – gimenete

+2

С iOS8.1 и AF версии 2.4.1 это не работает для меня. Не отправляет заголовок авторизации вообще. – Brynjar

6

Как @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 solution

+0

+1 для упоминания проблемы AFNetworking с вызовом auth. – user623396