pods objective how iphone objective-c ios json afnetworking

iphone - objective - AFNetworking-Cómo realizar solicitud POST



pod install xcode (1)

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 estar desactualizado para los recién llegados aquí.

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

La API que estoy consultando es RESTful, y necesito hacer solicitudes POST. Para ello, 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 realizar una solicitud GET , no una POST .
  • No puedo poner parámetros 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 hacerlo?

Gracias por la ayuda !


Puede anular el comportamiento predeterminado de su solicitud que se utiliza con AFNetworking para procesar como POST.

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

Esto supone que ha anulado la configuración de AFNetworking predeterminada para usar un cliente personalizado. Si no lo eres, te sugiero que lo hagas. Simplemente cree una clase personalizada para manejar su cliente de red por usted.

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 URLWithString: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; }

Entonces debería poder disparar sus llamadas de red en la cola de operaciones sin ningún problema.

MyAPIClient *client = [MyAPIClient sharedClient]; [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; [[AFNetworkActivityIndicatorManager sharedManager] 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 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];