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?


person Marckaraujo    schedule 30.09.2013    source источник


Ответы (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.

person Leguman    schedule 01.10.2013
comment
comment
Может подтвердить, что свойство учетных данных не работает. Игнорирует все назначенное. - person Michael; 28.04.2014
comment
Важно отметить: setAuthorizationHeaderFieldWithUsername:password: будет кодировать с использованием Base64. Если ваш сервер расшифровывает с использованием другого процесса расшифровки, это не будет работать, ЕСЛИ вы не настроите расшифровку вашего сервера с использованием Base64. - person Brandon A; 18.11.2016

Вот пример выполнения базовой проверки подлинности 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];
person titaniumdecoy    schedule 05.01.2014
comment
Это сработало для меня для некоторых запросов. Но составные запросы завершились неудачно из-за ошибки исчерпания потока тела запроса. Я не уверен без дальнейшего расследования, но я думаю, что ваше решение делает один запрос, ждет ответа 401, а затем повторяет запрос с заданными учетными данными. Таким образом, составные запросы терпят неудачу, потому что поток не может быть воспроизведен повторно. См. аналогичную проблему в AFNetworking 1.x github.com/AFNetworking/AFNetworking/issues/661 - person gimenete; 23.02.2014
comment
С iOS8.1 и AF версии 2.4.1 у меня это не работает. вообще не отправляет заголовок авторизации.. - person Brynjar; 22.10.2014

Как @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. Файл из Мэтт Галлахерс до решения ARC BASE64

person joneswah    schedule 12.07.2014