2012-02-06 16 views
19

Sto cercando di recuperare alcuni dati JSON con AFNetworking.Problema con il richiamo di JSON con AFNetworking

mio componente server (PHP/ZendFramework) batte la seguente risposta:

>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"} 

cerco di utilizzare il seguente codice per recuperare questi dati 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]); 
}]; 

Durante l'esecuzione nel simulatore della console mostra il seguente risultato:

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> 

Qualsiasi suggerimento su quello che sto facendo wr ong sarebbe molto apprezzato :) Ho provato ad accedere all'API di Twitter e questo funziona perfettamente ...

+0

come si risolve questo problema? con i dati? –

risposta

34

Questo è confuso, e qualcosa che ho cercato di capire come documentare/progettare correttamente meglio, ma è necessario per impostare l'intestazione Accept per la richiesta su application/json.

Registrazione AFJSONRequestOperation dice "qualsiasi richiesta che viene, guarderò e gestirò se si tratta di una richiesta JSON". Il modo in cui fai capire che una richiesta è JSON è quello di impostare l'appropriata intestazione Accept o aggiungere .json come estensione. In questo momento, la richiesta sta esaminando l'elenco delle classi operative, ma si trova solo su AFHTTPRequestOperation, che ha un tipo di oggetto risposta di NSData (ciò che vedi nel registro).

Mi dispiace per la confusione!

+2

Grazie mattt! Questo ha davvero aiutato - ora funziona come un fascino! – Goeran

+2

Se non si ha accesso al server per modificare le intestazioni di risposta, è possibile provare la soluzione proposta da Ben H in basso: id payload = [NSJSONSerialization JSONObjectWithData: Opzioni JSON: NSJSONWritingPretty Errore: nil]; Ha funzionato per me. – Sendoa

+0

@Sendoa: anche questo funziona! grazie – Claus

20

Qui ci sono le 3 linee ho dovuto aggiungere per ottenere la mia app per inviare e ricevere JSON:

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

Aggiungendo questa riga '[httpClient setDefaultHeader: @" Accept "valore: @" application/json "];' sta dando a me "Una rappresentazione appropriata della risorsa richiesta --- non può essere trovata su questo server". C'è un'altra parte di questo? –

+0

Mi sembra che il server non stia servendo JSON. – Tylerc230

+1

Questo ha funzionato per me come un incantesimo! Grazie! –

11

se si sta utilizzando una consuetudine accettare di testa, come me, AFNetworking non riconoscerà che stai chiedendo json, come spiegato da Mattt. un modo per aggirare questo è quello di convertire semplicemente i dati in un oggetto JSON nel blocco completo:

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

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

Non sono riuscito a modificare le intestazioni di risposta del server perché non ho accesso ad esso. Il server stava rispondendo con "text/html" invece di "application/json". Il tuo suggerimento funziona come un fascino. Grazie!!! – Sendoa

+0

stesso qui .. tuttavia trovo un po 'frustrante che tutte le classi che usano il mio client di riposo debbano chiamare questo codice deserializzante di JSON ... speravo di poter mettere tutte queste cose di configurazione nella mia classe REST di singelton – abbood

0

Ho avuto lo stesso problema, ma dopo ho aggiunto il Accept intestazione qualcosa di simile a @ Tylerc230 risposta, la richiesta di avvio di fallire perché il formato ricevuto "text/html" non era nel tipo di contenuto previsto, quindi ho aggiunto @"text/html" nella funzione acceptableContentTypes di AFJSONRequestOperation.m.

Problemi correlati