2011-05-09 4 views
3

Lors de la construction d'une requête HTTP POST en PHP Je peux utiliser une méthode simple appelée: http_build_query qui renverra les éléments suivants en fonction du tableau passé à la fonction:HTTP POST Tableau Params pour Java/Android

Tableau simple:

Array 
(
    [0] => foo 
    [1] => bar 
    [2] => baz 
    [3] => boom 
    [cow] => milk 
    [php] => hypertext processor 
) 

Retours:

flags_0=foo&flags_1=bar&flags_2=baz&flags_3=boom&cow=milk&php=hypertext+processor 

Un peu plus complexe tableau:

Array 
(
[user] => Array 
    (
     [name] => Bob Smith 
     [age] => 47 
     [sex] => M 
     [dob] => 5/12/1956 
    ) 

[pastimes] => Array 
    (
     [0] => golf 
     [1] => opera 
     [2] => poker 
     [3] => rap 
    ) 

[children] => Array 
    (
     [bobby] => Array 
      (
       [age] => 12 
       [sex] => M 
      ) 

     [sally] => Array 
      (
       [age] => 8 
       [sex] => F 
      ) 

    ) 

[0] => CEO 
) 

Retours:

user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M&user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera&pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12&children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8&children%5Bsally%5D%5Bsex%5D=F&flags_0=CEO 

Ce que je demande est, est-il possible de créer ce dernier format entité en Java/Android? Je l'ai essayé ce qui suit sans chance:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
nameValuePairs.add(new BasicNameValuePair("user", null)); 
nameValuePairs.add(new BasicNameValuePair("firstname", "admin")); 
nameValuePairs.add(new BasicNameValuePair("lastname", "admin")); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Espérons que quelqu'un sait comment atteindre cet objectif :) Cordialement, Morten

EDIT:

Fondamentalement, ce que je dois est au produit l'équivalent Java de ce PHP:

$params = array('user' => array(
    'firstname' => 'Bob Smith', 
    'lastname' => 'Johnson' 
)); 

C'est la même demande au format JSON:

{"user":{"firstname":"Bob Smith","lastname":"Johnson"}} 

J'ai juste besoin l'équivalent Java en application/x-www-form-urlencoded;)

BTW. Merci beaucoup de répondre au sudocode, vraiment l'apprecier!

+0

Le code semble être correct. Qu'est-ce qui ne fonctionne pas? – sudocode

+0

L'entité im posting semble être: "user = & prénom = admin & lastname = admin" auquel mon service ne répond pas bien;) J'ai besoin de: utilisateur% 5Bfirstname% 5D = admin & user% 5Blastname% 5D = admin –

+0

Vous voulez votre les noms de paramètres à entourer d'une URL codée '[' et ']'? Est-ce que ce n'est pas une bizarrerie de votre sortie de la fonction PHP plutôt que la sortie d'encodage standard? – sudocode

Répondre

0

Je pense que votre code est correct, mais votre attente de la sortie doit être incorrecte. Je ne pense pas que vous devriez vous attendre à ce que vos noms de paramètre soient entourés de crochets (urlencoded:% 5B et% 5D).

Si vous en avez besoin, vous devez ajouter les crochets à votre code Java, par exemple.

nameValuePairs.add(new BasicNameValuePair("[firstname]", "admin")); 
+0

Ah, cela pourrait être le cas. Ce que j'ai fait jusqu'ici pour tester est en utilisant PHP http_build_query et en utilisant Curl pour faire la demande de publication. J'ai également essayé d'utiliser le plugin Chrome nommé "XHR Poster" et l'équivalent firefox "Poster". Avec params comme décrit ci-dessus (généré à partir de PHP) cela fonctionne. Je m'attendais donc à ce que le service "ait besoin" des crochets. Fondamentalement, ce que j'ai besoin est d'au produit l'équivalent Java de ce PHP $ params = array ('user' => array ( 'prenom' => 'Bob Smith', 'lastname' => « Johnson ' )); –

+0

J'ai mis à jour ma question avec quelques informations supplémentaires concernant votre réponse ci-dessus;) Merci d'avoir répondu bt! –

+0

OK, je ne suis pas conscient d'une bibliothèque Java qui effectue une sérialisation équivalente d'un graphe d'objet dans les paramètres de requête d'URL. – sudocode

1

Je l'ai. Voici l'exemple de code:

 String data = EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); 
     data = "&" + data.replaceAll("%5B0%5D", "[0]"); 
     StringEntity se = new StringEntity(data, "UTF-8"); 
     se.setContentType("application/x-www-form-urlencoded"); 
     se.setContentEncoding("UTF-8"); 
     httppost.setEntity(se); 

Un peu méchant, mais ça fonctionne. Vous voudrez peut-être l'obtenir un peu plus générique - c'est pour le tableau à 1 élément seulement.