AFNetworking: cómo hacer una request POST

EDITAR 07/14

Como mencionó Bill Burgess en un comentario de su respuesta, esta pregunta está relacionada con la version 1.3 de AFNetworking . Puede ser anticuado para los recién llegados aquí.


Soy bastante nuevo en el desarrollo de iPhone, y estoy usando AFNetworking como mi biblioteca de services.

La API que estoy buscando es RESTful, y necesito hacer requestes POST. Para hacer esto, probé con el siguiente código:

 NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; NSURL *url = [NSURL URLWithString:@"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]; 

Hay dos problemas principales con este código:

  • AFJSONRequestOperation parece hacer una request GET , no una POST .
  • No puedo poner parameters a este método.

También probé con este código:

 NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; NSURL *url = [NSURL URLWithString:@"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); }]; 

¿Hay una mejor manera de hacer lo que quiero aquí para lograrlo?

Gracias por la ayuda !

Puede anular el comportamiento pnetworkingeterminado de su request que se utiliza con AFNetworking para procesar como un POST.

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

Esto supone que ha anulado la configuration pnetworkingeterminada de AFNetworking para usar un cliente personalizado. Si no lo eres, sugeriría hacerlo. Simplemente cree una class personalizada para manejar su cliente de networking para usted.

MyAPIClient.h

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

MyAPIClient.m

 @implementation MyAPIClient +(MyAPIClient *)shanetworkingClient { static MyAPIClient *_shanetworkingClient = nil; static dispatch_once_t oncePnetworkingicate; dispatch_once(&oncePnetworkingicate, ^{ _shanetworkingClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:webAddress]]; }); return _shanetworkingClient; } -(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; } 

Entonces debería poder disparar sus llamadas de networking en la queue de operaciones sin problemas.

  MyAPIClient *client = [MyAPIClient shanetworkingClient]; [[AFNetworkActivityIndicatorManager shanetworkingManager] setEnabled:YES]; [[AFNetworkActivityIndicatorManager shanetworkingManager] incrementActivityCount]; NSString *path = [NSString stringWithFormat:@"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 shanetworkingManager] decrementActivityCount]; // do something with return data }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { // code for failed request goes here [[AFNetworkActivityIndicatorManager shanetworkingManager] decrementActivityCount]; // do something on failure }]; [operation start];