44 votes

AFNetworking 2.0 et authentification de base HTTP

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 ?

96voto

Leguman Points 575

La nouvelle architecture d'AFNetworking 2.0 utilise des sérialiseurs pour créer des demandes 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 l'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 setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"];

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

15voto

titaniumdecoy Points 7548

Voici un exemple de réalisation d'une authentification HTTP de base avec AFNetworking 2.0 en utilisant NSURLCredential. L'avantage de cette approche par rapport à l'utilisation de AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password: est que vous pouvez automatiquement stocker le nom d'utilisateur et le mot de passe dans le trousseau de clés en changeant la valeur de l'attribut persistence: du paramètre 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];

6voto

joneswah Points 1012

Comme le mentionne @gimenete, les requêtes multipartites échoueront lors de l'utilisation de l'approche crédentielle de @titaniumdecoy car elle est appliquée dans le bloc de défi et la version actuelle d'AFNetworking a un problème avec cela. Au lieu d'utiliser l'approche crédentielle, 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 d'une tierce partie, telle que NSData+Base64.h et .m File à partir de Solution BASE64 de Matt Gallaghers avant ARC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X