Подтвердить что ты не робот

AFNetworking 2.0 и HTTP Basic Authentication

Не удается найти AFHTTPClient в AFNetworking 2.0, чтобы использовать:

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

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

Как ему нужно управлять в AFNetworking 2.0?

4b9b3361

Ответ 1

Новая архитектура ARNetworking 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.

Ответ 2

Вот пример выполнения базовой 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];

Ответ 3

По мере того, как @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 File из Matt Gallaghers для решения ARC BASE64