2011-10-30 16 views
16

Estoy tratando de encontrar una forma, usando AFNetworking, para establecer el encabezado Content-Type para application/json y para POST con JSON en el cuerpo. Los métodos que estoy viendo en la documentación (postPath y requestWithMethod) toman un diccionario de parámetros, que supongo está codificado en la sintaxis de formulario estándar. ¿Alguien sabe de una forma de instruir a AFHTTPClient para usar JSON para el cuerpo, o tengo que escribir la solicitud por mi cuenta?Publicación de JSON como el cuerpo de una solicitud POST usando AFHTTPClient

Respuesta

23

Me adelanté y revisé la última AFNetworking de su master branch. Fuera de la caja, pude obtener el comportamiento deseado. Miré y parece un cambio reciente (6 de octubre) por lo que es posible que solo necesites sacar lo último.

que escribió el código siguiente para hacer una petición:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 
[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

Bajo mi representante puedo ver la solicitud de prima:

POST /hello123 HTTP/1.1 
Host: localhost:8080 
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8 
User-Agent: info.evanlong.apps.TestSample/1.0 (unknown, iPhone OS 4.3.2, iPhone Simulator, Scale/1.000000) 
Accept-Encoding: gzip 
Content-Type: application/json; charset=utf-8 
Accept: */* 
Content-Length: 21 
Connection: keep-alive 

{"k2":"v2","k1":"v1"} 

Desde la fuente AFHTTPClient se puede ver que JSON codificación es la predeterminado basado en line 170 y line 268.

+11

Eh, no me di cuenta JSON se estableció a ser la codificación predeterminada. Esto es un error (la forma de codificación de URL siempre ha sido mi intención de ser la predeterminada, no estoy seguro de cómo se deslizó). @EricAndres: tenga en cuenta esto, y establezca la codificación del parámetro en JSON manualmente, con 'self.parameterEncoding = AFJSONParameterEncoding;' en su código. – mattt

+0

Impresionante, gracias por la respuesta. Probaré la configuración self.parameterEncoding later cuando tenga la oportunidad. –

+0

hmm ... json no era la codificación predeterminada, pero NVP estaba (a principios de 2013) – stackOverFlew

13

Para mí, json NO era la codificación predeterminada. Puede configurar manualmente de la codificación predeterminada de esta manera:

(utilizando el código de Evan)

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 

[client setParameterEncoding:AFJSONParameterEncoding]; 

[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

la parte crucial:

[client setParameterEncoding:AFJSONParameterEncoding]; 
+1

¡Muchas gracias! Tenías razón, el '[client setParameterEncoding: AFJSONParameterEncoding];' faltaba. Pero además parece que esto también es necesario para que realmente funcione con NSDictionary: '[client registerHTTPOperationClass: [AFJSONRequestOperation class]];' – thedp

+0

Muchas gracias. ¡¡Me salvaste el día !! – kb920

Cuestiones relacionadas