2012-02-06 8 views
19

Estoy tratando de recuperar algunos datos JSON con AFNetworking.Problema con la recuperación de JSON con AFNetworking

Mi componente de servidor (PHP/ZendFramework) ofrece 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 utilizar el código siguiente 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 de la la consola muestra la siguiente salida:

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 pista sobre lo que estoy haciendo wr ong sería muy apreciado :) Intenté acceder a la API de Twitter y eso funciona perfectamente bien ...

+0

¿Cómo resuelves este problema? con datos? –

Respuesta

34

Esto es confuso, y algo que he tratado de averiguar cómo documentar/diseñar mejor, pero necesita para configurar su encabezado Accept para la solicitud a application/json.

Al registrar AFJSONRequestOperation dice "cualquier solicitud que se reciba, la examinaré y administraré si se trata de una solicitud JSON". La forma en que sugiere que una solicitud es JSON es establecer el encabezado Accept apropiado o agregar .json como la extensión. En este momento, la solicitud está pasando por la lista de clases de operación, pero solo se activa en AFHTTPRequestOperation, que tiene un tipo de objeto de respuesta de NSData (lo que está viendo en el registro).

Disculpa la confusión!

+2

gracias mattt! Esto realmente ayudó, ¡ahora funciona como un encanto! – Goeran

+2

Si no tiene acceso a su servidor para cambiar los encabezados de respuesta, puede probar la solución propuesta por Ben H más abajo: id payload = [NSJSONSerialization JSONObjectWithData: JSON options: NSJSONWritingPrettyPrinted error: nil]; Me funcionó. – Sendoa

+0

@Sendoa: ¡eso también funciona! gracias – Claus

20

Estas son las 3 líneas que tenía que añadir para conseguir mi aplicación para enviar y recibir JSON:

httpClient.parameterEncoding = AFJSONParameterEncoding; 
[httpClient setDefaultHeader:@"Accept" value:@"application/json"]; 
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
+0

Agregar esta línea '[httpClient setDefaultHeader: @" Aceptar "valor: @" application/json "];' me está dando "No se pudo encontrar una representación adecuada del recurso solicitado en este servidor". ¿Hay otra parte de esto? –

+0

Me parece que el servidor no está sirviendo a JSON. – Tylerc230

+1

¡Esto funcionó para mí como un encanto! ¡Gracias! –

11

si está utilizando una costumbre aceptar cabecera, como soy, AFNetworking no reconocerá que estás solicitando json, como mattt explicó. Una forma de evitar esto es simplemente convertir los datos en un objeto JSON en el bloque de ejecución:

^(AFHTTPRequestOperation *operation, id JSON) 
{ 
    id payload = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONWritingPrettyPrinted error:nil]; 

    NSLog(@"Fetched: %@", payload); 
} 
+1

No pude cambiar los encabezados de respuesta de los servidores porque no tengo acceso a ellos. El servidor estaba respondiendo con "text/html" en lugar de "application/json". Tu sugerencia funciona como un encanto. ¡¡¡Gracias!!! – Sendoa

+0

mismo aquí ... sin embargo, me resulta un poco frustrante que todas las clases que usan mi cliente de reposo tengan que llamar a este código json deserializante ... esperaba que pudiera agrupar todas estas cosas de configuración en mi clase REST singelton – abbood

0

he tenido el mismo problema, pero después he añadido el algo Accept cabecera como en @ Tylerc230 respuesta, la solicitud de inicio de fallar porque el formato "text/html" recibido no estaba en el tipo de contenido esperado, así que agregué @"text/html" en la función acceptableContentTypes de AFJSONRequestOperation.m.

Cuestiones relacionadas