2009-10-05 10 views
5

No sé casi nada sobre JSON y necesito enviar una solicitud a un servidor y leer los datos que provienen de ella, solo con el iPhone.JSON IPHONE: ¿Cómo enviar una solicitud JSON y extraer los datos de un servidor?

He intentado usar el jason-framework para hacer eso, pero después de leer la documentación no pude averiguar cómo construir el objeto y enviarlo a la solicitud. Así que decidí adaptar otro código que vi aquí en SO.

El objeto que necesito es la siguiente:

{ "código": xxx}

Aquí tengo un problema. Este xxx es un NSData, así que sospecho que tengo que convertir estos datos a una cadena, luego uso esta cadena para construir un objeto y enviarlo a la solicitud.

la respuesta del servidor es también un objeto JSON, en forma

{ "respuesta": "yyy"} donde yyy es un número entre 10000 y 99999

este es el código que tengo hasta lejos.

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

todo lo que me da este código es un error. O MALA URL o excepción java.

¿Qué hay de malo en este código?

Si ustedes prefieren dar otra solución utilizando el JSON-marco por favor dígame cómo codificar el objeto con ese par ("código", "mi NSData aquí convertida en cadena") ...

gracias para cualquier ayuda.

Respuesta

17

JSON framework admite la conversión de matrices, diccionarios, cadenas, números y booleanos. Entonces, lo que quiere hacer es convertir sus datos a uno de estos formatos. Dado que sus datos están NSData más fácil manera de hacerlo es convertirlo con:

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

Dependiendo de lo que está en la memoria intermedia (y si su servidor puede manejar la situación) es posible que desee Base64 codificar el resultado (comprobar http://www.cocoadev.com/index.pl?BaseSixtyFour si no' t tener un convertidor a mano). Incluso podría ir directamente desde NSData a una cadena codificada en Base64.

Ahora crear un diccionario con un elemento con la clave y el valor codestringData (de último paso):

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

Esto se puede convertir fácilmente a JSON. Sólo tiene que importar JSON.h en el encabezado de código, a continuación, utilizar:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

se descarga y verá su cadena JSON - algo así como: {"code" : "{yourstringdata}"; }. La forma más fácil de enviar esto a su servidor es usar la biblioteca ASIHTTPRequest con un método POST.

Una vez que obtenga el resultado de nuevo desde el servidor del marco JSON puede analizar de nuevo en un diccionario y entonces se puede obtener la información que necesita:

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

Gracias !!!!!! ¡Eso es!La documentación de la biblioteca ASIHTTPRequest es bastante incompleta y superficial (no es tu culpa), pero logré que funcionara siguiendo tus instrucciones. ¡Perfecto! ¡Eres D hombre! – SpaceDog

+0

Me alegro de que funcionó para usted. No te rindas en ASIHTTPRequest. Es bastante sencillo una vez que te acostumbras. Lo único es que no se olvide de proporcionar los métodos setDidFinishSelector/setDidFailSelector y configurar el delegado para que reciba una notificación cuando falle la red. Demasiadas zonas muertas de células por ahí. – Ramin

Cuestiones relacionadas