2010-09-24 12 views
6

Oye, necesito hacer una solicitud HTTP POST con una matriz de objetos NSDictionary.Cómo utilizar ASIFormDataRequest para http post array de objetos NSDictionary

Cuando hago esto, sin embargo, noto en el lado del servidor que el objeto NSDictionary no se deserializa a un hash. Se deserializa a una cadena, que no es lo que quiero.

Esta es la forma en que envío el parámetro desde el cliente (iPhone): el

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
for (ABContact *c in contactsWithEmailsOrPhones){ 
    NSString *phoneNumber = [[ABContactsHelper class] contactPhoneNumber:c]; 
    NSString *email = [[c emailArray] objectAtIndex:0]; 
    NSLog(@"looping: %@, %@", phoneNumber, email); 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
         phoneNumber, 
         @"phone", 
         email, 
         @"email", 
         [c firstname], 
         @"firstname", 
          [c lastname], 
          @"lastname", nil]; 

    [request addPostValue:dict forKey:@"contacts[]"]; 
} 

[request setDelegate:self]; 
[request startAsynchronous]; 

Esto es cómo se ve cuando se deserializa en el servidor (rieles): el

Started POST "/app/find_friends" for 67.164.97.48 at Thu Sep 23 14:40:37 -0700 2010 
Processing by app#find_friends as HTML 
Parameters: {"contacts"=>["{\n    email = \"xx\";\n    firstname = xx;\n    lastname = xx;\n    phone = \"xx\";\n}", "{\n    email = \"xx\";\n    firstname = xx;\n    lastname = xx;\n    phone = \"xx\";\n}"]} 
Completed 200 OK in 0ms (Views: 0.3ms | ActiveRecord: 0.0ms) 

Estoy seguro de que este es un problema común que enfrentan las personas. Entonces definitivamente hay una solución para esto.

Gracias de antemano por todos los comentarios/respuestas.

Respuesta

2

En primer lugar, para explicar lo que se está viendo:

El método addPostValue está diseñado para tener un solo valor, y las llamadas [Descripción Valor] para convertir ese valor en una cadena. El método de descripción proporciona una representación de cadena, que es lo que está viendo en el lado del servidor (el método de descripción es también lo que NSLog llama si le pasa un objeto, por lo que el formato debería parecer bastante familiar). Entonces se le ha pedido al iphone que envíe una cadena, y lo hace, y el servidor está "correctamente" mostrándolo como una cadena.

Si solo desea enviar un solo contacto, simplemente llame a 'addPostValue' para cada par clave/valor, es decir. una vez para el teléfono, otra vez para el correo electrónico, etc.

Si quiere pasar múltiples contactos probablemente necesite algo mejor. No estoy muy familiarizado con ruby-on-rails, por lo que puede haber otras soluciones, pero sin duda una forma común de pasar estructuras de datos más complejas a los servicios web desde el iPhone es usar json.

Hay una biblioteca JSON para el iPhone aquí:

http://code.google.com/p/json-framework/

y Ruby on Rails tiene soporte JSON.

+0

Gracias por la respuesta. Entiendo que JSON es una opción, ¿pero es que la única forma en que los hashes (mapas) se envían como parámetros de publicación? – amehta

+1

Puede usar SOAP o XML simple en su lugar, pero consideraría que JSON es la opción más simple. Al final del día, un http POST simplemente está enviando (casi) texto de forma libre al servidor. Si es solo un simple diccionario, entonces como mencioné, puedes llamar a addPostValue para cada clave/valor (o modificar ASIHTTPRequest para que acepte un diccionario y agregar cada clave/valor), pero para algo más complejo necesitas algo que estructura el datos en una cadena con un formato definido que admite tanto el cliente como el servidor: json es la manera más simple de hacerlo. – JosephH

+0

Ok. Esperaba que hubiera una forma no JSON/XML/SOAP/YAML. Quiero decir, cuando llamo addPostValue, agrego un par de valores clave. Entonces, intuitivamente, pensé que un * valor * podría ser otro Hash. Además, cuando llamo addPostValue, parece que me permite enviar una matriz como parámetro (como se ve en el registro del servidor que publiqué), por lo que a mí me pareció que también debería admitirse un objeto Hash. Supongo que no. – amehta

0

se puede hacer algo como esto

[request setPostValue:login forKey:@"user[login]"]; [request setPostValue:password forKey:@"user[password]"];