2010-09-24 4 views
6

Hey, j'ai besoin de faire une requête HTTP POST avec un tableau d'objets NSDictionary. Lorsque je fais cela, cependant, je remarque du côté serveur que l'objet NSDictionary n'est pas désérialisé en un hachage. Il est désérialisé en une chaîne - ce qui n'est pas ce que je veux.Comment utiliser ASIFormDataRequest pour http post tableau d'objets NSDictionary

Voilà comment j'envoie le paramètre du client (iPhone) côté:

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

C'est à quoi il ressemble quand il est désérialisé sur le serveur (rails) côté:

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) 

Je suis sûr que c'est un problème commun auquel les gens font face. Donc, il y a certainement une solution pour cela.

Merci d'avance pour tous les commentaires/réponses.

Répondre

2

Tout d'abord, pour expliquer ce que vous voyez:

La méthode addPostValue est conçu pour une seule valeur, et les appels [Description de la valeur] pour convertir cette valeur en une chaîne. La méthode de description donne une représentation sous forme de chaîne, ce que vous voyez du côté serveur (la méthode description est aussi ce que NSLog appelle si vous lui passez un objet, donc le format devrait vous sembler familier). Donc, l'iphone a été invité à envoyer une chaîne, et le fait, et le serveur montre "correctement" cela comme une chaîne.

Si vous voulez simplement envoyer un seul contact, appelez simplement 'addPostValue' pour chaque paire clé/valeur - c.-à-d. une fois pour le téléphone, encore pour le courrier électronique, etc.

Si vous souhaitez passer plusieurs contacts, vous avez probablement besoin de quelque chose de mieux. Je ne suis pas vraiment familier avec ruby-on-rails donc il peut y avoir d'autres solutions, mais certainement un moyen courant de passer des structures de données plus complexes aux webservices de l'iphone est d'utiliser json.

Il y a une bibliothèque JSON pour iphone ici:

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

et rubis sur des rails a un support intégré JSON.

+0

Merci pour la réponse. Je comprends JSON est une option, mais est-ce que la seule façon hash (cartes) sont envoyés en tant que paramètres post? – amehta

+1

Vous pouvez utiliser le XML SOAP ou XML à la place, mais je considérerais JSON comme l'option la plus simple. À la fin de la journée, un POST http envoie juste (presque) du texte libre au serveur. Si c'est juste un simple dictionnaire, comme je l'ai mentionné, vous pouvez appeler addPostValue pour chaque clé/valeur (ou modifier ASIHTTPRequest afin qu'il accepte un dictionnaire et ajouter chaque clé/valeur), mais pour quelque chose de plus complexe, vous avez besoin de quelque chose données dans une chaîne avec un format défini que le client et le serveur prennent en charge - json est la manière la plus simple de le faire. – JosephH

+0

Ok. J'espérais qu'il y avait une manière non JSON/XML/SOAP/YAML. Je veux dire, quand j'appelle addPostValue - j'ajoute une paire de valeur de clé. Donc, intuitivement, j'ai pensé qu'une * valeur * pourrait être un autre Hash. De plus, quand je l'appelle addPostValue - il semble que cela me permet d'envoyer un tableau en tant que paramètre (comme on le voit dans le journal du serveur que je posté), donc pour moi, il semblait être un objet Hash doit également être pris en charge. Je suppose que non. – amehta

0

vous pouvez faire quelque chose comme ça

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