json - afnetworking example
Problema al recuperar JSON con AFNetworking (4)
Estoy tratando de recuperar algunos datos JSON con AFNetworking.
El componente de mi servidor (PHP / ZendFramework) entrega la siguiente respuesta:
>curl -i http://test.local:8080/public/appapi/testaction/format/json
HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 10:37:20 GMT
Server: Apache
X-Powered-By: PHP/5.3.8
Content-Length: 35
Content-Type: application/json
{"entries":"test","abcxxx":"test2"}
Intento usar el siguiente código para recuperar estos datos json:
NSString *baseurl = @"http://test.local:8080";
NSString *path = @"/public/appapi/testaction/format/json";
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseurl]];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setAuthorizationHeaderWithUsername:@"myusername" password:@"mypassword"];
[client getPath:path parameters:nil success:^(__unused AFHTTPRequestOperation *operation, id JSON) {
//NSLog(@"sjson: %@", [JSON valueForKeyPath:@"entries"]);
NSLog(@"sjson: %@", JSON);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error Code: %i - %@",[error code], [error localizedDescription]);
}];
Cuando se ejecuta en el simulador, la consola muestra el siguiente resultado:
2012-02-06 11:22:39.800 App[3642:15803] sjson: <6a736f6e 466c6963 6b724170 69287b22 6d657468 6f64223a 7b225f63 6f6e7465 6e74223a 22666c69 636b722e 74657374 2e656368 6f227d2c 2022666f 726d6174 223a7b22 5f636f6e 74656e74 223a226a 736f6e22 7d2c2022 6170695f 6b657922 3a7b225f 636f6e74 656e7422 3a223336 32306666 32343265 37323336 34633135 32373031 31353438 62393335 3066227d 2c202273 74617422 3a226f6b 227d29>
Cualquier sugerencia sobre lo que estoy haciendo mal sería muy apreciada :) Intenté acceder a la API de Twitter y funciona perfectamente bien ...
Aquí están las 3 líneas que tuve que agregar para que mi aplicación envíe y reciba JSON:
httpClient.parameterEncoding = AFJSONParameterEncoding;
[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
Esto es confuso, y algo que he estado tratando de averiguar cómo documentar / diseñar mejor correctamente, pero necesita configurar su encabezado Accept
para la solicitud a application/json
.
El registro de AFJSONRequestOperation
dice "cualquier solicitud que llegue, lo veré y lo manejaré si es una solicitud JSON". La forma de sugerir que una solicitud es JSON es establecer el encabezado de Accept
adecuado o agregar .json
como la extensión. En este momento, la solicitud está pasando por la lista de clases de operación, pero solo AFHTTPRequestOperation
, que tiene un tipo de objeto de respuesta de NSData
(lo que está viendo en el registro).
¡Perdón por la confusión!
Si está utilizando un encabezado de aceptación personalizado, como soy yo, AFNetworking no reconocerá que está solicitando json, como explicó mattt. Una forma de evitar esto es simplemente convertir los datos en un objeto json en su bloque de finalización:
^(AFHTTPRequestOperation *operation, id JSON)
{
id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil];
NSLog(@"Fetched: %@", payload);
}
Tuve el mismo problema, pero después de agregar el encabezado Accept
algo así como en la respuesta de @ Tylerc230, la solicitud comenzó a fallar porque el formato recibido "text/html"
no estaba en el tipo de contenido esperado, así que agregué @"text/html"
en acceptableContentTypes
función de AFJSONRequestOperation.m
.