2009-10-05 13 views
5

Znam prawie nic o JSON i potrzebuję wysłać zapytanie do serwera i odczytać dane z niego pochodzące, używając tylko iPhone'a.JSON IPHONE: Jak wysłać żądanie JSON i pobrać dane z serwera?

Próbowałem użyć do tego celu jason-framework , ale po przeczytaniu dokumentacji nie byłem w stanie dowiedzieć się, jak skonstruować obiekt i wysłać go na żądanie. Postanowiłem więc zaadaptować inny kod, który widziałem tutaj na SO.

Przedmiot muszę to:

{ "code": xxx}

Tu mam problem. Ten xxx jest NSData, więc podejrzewam, że muszę przekonwertować te dane na ciąg, a następnie użyć tego ciągu do zbudowania obiektu i wysłać go na żądanie.

odpowiedź serwera jest również obiekt JSON w formie

{ „odpowiedź”: „yyy”} gdzie yyy to liczba pomiędzy 10000 a 99999

jest to kod mam tak daleko.

- (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]; 
} 

cały ten kod daje mi błędy. Lub BAD URL lub wyjątek Java.

Co jest nie tak z tym kodem?

Jeśli faceci wolą dać inne rozwiązanie za pomocą JSON-ram proszę mi powiedzieć jak zakodować obiektu przy użyciu tej pary („Kod”, „moja NSData tutaj zamienione na ciąg”) ...

dzięki za każdą pomoc.

Odpowiedz

17

JSON framework obsługuje konwertowanie tablic, słowników, łańcuchów, liczb i wartości logicznych. Więc to, co chcesz zrobić, to przekonwertować dane do jednego z tych formatów. Ponieważ dane są NSData Najprostszym sposobem jest przekształcenie go z:

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

W zależności od tego, co znajduje się w buforze (jeśli serwer może obsłużyć), może chcesz Base64 zakodować wynik (sprawdź http://www.cocoadev.com/index.pl?BaseSixtyFour jeśli don” t mieć pod ręką konwerter). Możesz nawet przejść od NSData prosto do łańcucha zakodowanego w Base64.

Teraz utworzyć słownik z jednej pozycji z kluczem code i wartości stringData (od ostatniego kroku):

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

ten można łatwo przekształcić w JSON. Wystarczy zaimportować JSON.h w nagłówku kodu, a następnie użyć:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

Dump go i zobaczysz swój ciąg JSON - coś takiego: {"code" : "{yourstringdata}"; }. Najłatwiejszym sposobem wysłania tego na serwer jest użycie biblioteki ASIHTTPRequest z metodą POST.

Gdy pojawi się wynik z serwera ramy JSON można analizować go z powrotem do słownika, a następnie można dostać się do potrzebnych danych:

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

Thanks !!!!!! to jest to!Dokumentacja biblioteki ASIHTTPRequest jest dość niekompletna i powierzchowna (nie twoja wina), ale udało mi się ją wykonać przy użyciu twoich instrukcji. Idealny! Jesteś D człowiekiem! – SpaceDog

+0

Cieszę się, że to zadziałało. Nie poddawaj się ASIHTTPRequest. Po opanowaniu jest to dość proste. Jedyną rzeczą jest, nie zapomnij podać metody setDidFinishSelector/setDidFailSelector i ustawić delegata, aby otrzymywać powiadomienia, gdy sieć nie powiedzie się. Zbyt wiele stref martwych komórek. – Ramin

Powiązane problemy