web-dev-qa-db-fra.com

AFNetworking 2.0 et authentification HTTP de base

Impossible de trouver AFHTTPClient sur AFNetworking 2.0, à utiliser:

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

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

Comment doit-il être géré sur AFNetworking 2.0?

44
Marckaraujo

La nouvelle architecture AFNetworking 2.0 utilise des sérialiseurs pour créer des requêtes et analyser les réponses. Pour définir l'en-tête d'autorisation, vous devez d'abord initialiser un gestionnaire d'opérations de demande qui remplace AFHTTPClient, créer un sérialiseur, puis appeler la méthode dédiée pour définir l'en-tête.

Par exemple, votre code deviendrait:

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

Vous devriez lire le documentation et le guide de migration pour comprendre les nouveaux concepts fournis avec la version 2.0 d'AFNetworking.

96
Leguman

Voici un exemple d'exécution de l'authentification HTTP de base avec AFNetworking 2.0 à l'aide de NSURLCredential. L'avantage de cette approche par rapport à l'utilisation de AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password: la méthode consiste à stocker automatiquement le nom d'utilisateur et le mot de passe dans le trousseau en modifiant le persistence: paramètre de NSURLCredential. (Voir cette réponse .)

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

Comme @gimenete le mentionne, les demandes en plusieurs parties échouent lors de l'utilisation de l'approche des informations d'identification @titaniumdecoy car cela est appliqué dans le bloc de défi et la version actuelle d'AFNetworking a un problème avec cela. Au lieu d'utiliser l'approche des informations d'identification, vous pouvez intégrer l'authentification dans l'en-tête 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"];

Où vous devrez utiliser une bibliothèque d'encodage BASE64 tierce telle que NSData + Base64.h et .m File from Matt Gallaghers pre ARC BASE64 solution

6
joneswah