AFNetworking – Comment faire une requête POST

EDIT 07/14

Comme Bill Burgess l'a mentionné dans un commentaire de sa réponse, cette question est liée à la version 1.3 de AFNetworking . Il peut être obsolète pour les nouveaux venus ici.


Je suis novice dans le développement de l'iPhone et j'utilise AFNetworking comme bibliothèque de services.

L'API que j'interroge est une API RESTful, et j'ai besoin de faire des requêtes POST. Pour ce faire, j'ai essayé avec le code suivant:

 NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; NSURL *url = [NSURL URLWithSsortingng:@"http://localhost:8080/login"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"Pass Response = %@", JSON); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { NSLog(@"Failed Response : %@", JSON); }]; [operation start]; 

Il y a deux problèmes principaux avec ce code:

  • AFJSONRequestOperation semble faire une requête GET , pas une POST .
  • Je ne peux pas mettre de parameters à cette méthode.

J'ai aussi essayé avec ce code:

 NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; NSURL *url = [NSURL URLWithSsortingng:@"http://localhost:8080"]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; [httpClient postPath:@"/login" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Succes : %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Failure : %@", error); }]; 

Y a-t-il une meilleure façon de faire ce que je veux ici pour le faire?

Merci pour l'aide !

Vous pouvez replace le comportement par défaut de votre request utilisée avec AFNetworking pour le traitement en tant que POST.

 NSURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:nil]; 

Cela suppose que vous avez remplacé l'installation AFNetworking par défaut pour utiliser un client personnalisé. Si vous n'êtes pas, je suggère de le faire. Créez simplement une class personnalisée pour gérer votre client réseau pour vous.

MyAPIClient.h

 #import <Foundation/Foundation.h> #import "AFHTTPClient.h" @interface MyAPIClient : AFHTTPClient +(MyAPIClient *)sharedClient; @end 

MyAPIClient.m

 @implementation MyAPIClient +(MyAPIClient *)sharedClient { static MyAPIClient *_sharedClient = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithSsortingng:webAddress]]; }); return _sharedClient; } -(id)initWithBaseURL:(NSURL *)url { self = [super initWithBaseURL:url]; if (!self) { return nil; } [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; [self setDefaultHeader:@"Accept" value:@"application/json"]; self.parameterEncoding = AFJSONParameterEncoding; return self; } 

Ensuite, vous devriez être en mesure de triggersr vos appels réseau sur la queue d'opération sans problème.

  MyAPIClient *client = [MyAPIClient sharedClient]; [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; [[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; NSSsortingng *path = [NSSsortingng ssortingngWithFormat:@"myapipath/?value=%@", value]; NSURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:nil]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { // code for successful return goes here [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; // do something with return data }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { // code for failed request goes here [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; // do something on failure }]; [operation start];