2009-10-05 17 views
5

Non conosco quasi nulla di JSON e devo inviare una richiesta ad un server e leggere i dati che ci arrivano, usando solo l'iPhone.IPONE JSON: come inviare una richiesta JSON e prelevare i dati da un server?

Ho provato a utilizzare lo jason-framework per farlo, ma dopo aver letto le documentazioni non sono stato in grado di capire come costruire l'oggetto e inviarlo sulla richiesta. Così ho deciso di adattare un altro codice che ho visto qui su SO.

L'oggetto quello che serve è questo:

{ "codice": xxx}

Qui ho un problema. Questo xxx è un NSData, quindi ho il sospetto che devo convertire questi dati in una stringa, quindi utilizzare questa stringa per creare un oggetto e inviarlo sulla richiesta.

la risposta del server è anche un oggetto JSON, sotto forma

{ "risposta": "yyy"} dove yyy è un numero compreso tra 10000 e 99999

Questo è il codice che ho così lontano.

- (NSString *)checkData:(NSData) theData { 
    NSString *jsonObjectString = [self encode:(uint8_t *)theData length:theData.length];  
    NSString *completeString = [NSString stringWithFormat:@"http://www.server.com/check?myData=%@", jsonObjectString];        
    NSURL *urlForValidation = [NSURL URLWithString:completeString];    
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];       
    [validationRequest setHTTPMethod:@"POST"];    
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil]; 
    [validationRequest release]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; 
    NSInteger response = [responseString integerValue]; 
    NSLog(@"%@", responseString); 
    [responseString release]; 
    return responseString; 
} 


- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t *output = (uint8_t *)data.mutableBytes; 

    for (NSInteger i = 0; i < length; i += 3) { 
     NSInteger value = 0; 
     for (NSInteger j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger index = (i/3) * 4; 
     output[index + 0] = table[(value >> 18) & 0x3F]; 
     output[index + 1] =     table[(value >> 12) & 0x3F]; 
     output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    ret 

    urn [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

tutto questo codice mi dà errori. O URL BAD o eccezione java.

Cosa c'è di sbagliato con questo codice?

Se voi ragazzi preferiscono dare un'altra soluzione utilizzando il JSON-quadro prego di dirmi come codificare l'oggetto utilizzando quella coppia ("codice", "il mio NSData qui convertito in stringa") ...

grazie per qualsiasi aiuto

risposta

17

Il framework JSON supporta la conversione di array, dizionari, stringhe, numeri e booleani. Quindi quello che vuoi fare è convertire i tuoi dati in uno di questi formati. Dal momento che i dati sono al NSData modo più semplice è quello di convertire con:

NSString* stringData = [[NSString alloc] initWithData:yourData 
              encoding:NSUTF8StringEncoding]; 

A seconda di ciò che è nel buffer (e se il server è in grado di gestirlo) si potrebbe voler Base64 codificare il risultato (controllare http://www.cocoadev.com/index.pl?BaseSixtyFour se si don' t avere un convertitore a portata di mano). Si potrebbe anche passare direttamente da NSData a una stringa con codifica Base64.

Ora creare un dizionario con una sola voce con la chiave e il valore codestringData (da ultimo passo):

NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObject:stringData 
                  forKey:@"code"]; 

Questo può essere facilmente convertito in JSON. Basta importare JSON.h nell'intestazione del codice, quindi utilizzare:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

è dump e vedrete la vostra stringa JSON - qualcosa come: {"code" : "{yourstringdata}"; }. Il modo più semplice per inviarlo al tuo server è utilizzare la libreria ASIHTTPRequest con un metodo POST.

volta che si ottiene il risultato di nuovo dal server quadro JSON possibile analizzare di nuovo in un dizionario e poi si può uscire i dati necessari:

NSDictionary* responseDict = [yourJSONResponseStringFromServer JSONValue]; 
NSNumber* answerNum = (NSNumber *) [responseDict objectForKey:@"answer"]; 
int answer = [answerNum intValue]; 
+0

Grazie !!!!!! questo è tutto!la documentazione della libreria ASIHTTPRequest è piuttosto incompleta e superficiale (non è colpa tua), ma sono riuscito a farlo funzionare seguendo le tue istruzioni. Perfezionare! Sei un uomo D! – SpaceDog

+0

Felice che abbia funzionato per te. Non rinunciare a ASIHTTPRequest. È piuttosto semplice una volta capito. L'unica cosa è, non dimenticare di fornire i metodi setDidFinishSelector/setDidFailSelector e impostare il delegato in modo da essere avvisati quando la rete fallisce. Troppe zone morte cellulari là fuori. – Ramin

Problemi correlati