2011-05-09 58 views
3

當PHP構建一個HTTP POST查詢我可以使用一個名爲簡單的方法:http_build_query將返回基於傳遞給函數在陣列上的以下內容:HTTP POST陣列PARAMS的Java/Android的

簡單數組:

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

返回:

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

複雜一點的數組:

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 
) 

返回:

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 

我在問什麼,有沒有什麼辦法來創建的Java/Android的後者實體格式?我試過,沒有任何運氣如下:

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

希望有人知道如何做到這一點:) 親切的問候, 莫滕

編輯:

基本上我需要的是產品在Java中對應的PHP的:

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

這是JSON格式相同的請求:

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

我只需要在Java等效於應用程序/ x-WWW-form-urlencoded格式;)

順便說一句。非常感謝您回答sudocode,真正appriciate它!

+0

代碼看起來是正確的。什麼不起作用? – sudocode 2011-05-09 14:37:14

+0

我發佈的實體似乎是:「user =&firstname = admin&lastname = admin」,我的服務對此做出了很好的反應;) 我需要:user%5Bfirstname%5D = admin&user%5Blastname%5D = admin – 2011-05-09 16:10:26

+0

你想要你參數名稱被URL編碼的'['和']'包圍?這不是PHP函數輸出的怪癖,而不是標準的編碼輸出嗎? – sudocode 2011-05-09 16:42:09

回答

0

我認爲你的代碼是正確的,但你對它應該產生什麼輸出的期望是不正確的。我認爲你不應該期望你的參數名被包圍在方括號中(urlencoded:%5B和%5D)。

如果您需要,您需要將括號添加到您的Java代碼中,例如,

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

啊,這可能是因爲情況。到目前爲止我所做的測試是使用PHP的http_build_query並使用Curl來完成發佈請求。我也嘗試使用名爲「XHR海報」的Chrome插件和與Firefox等效的「海報」。 使用上述的參數(從PHP生成)可以工作。所以我期望該服務「需要」括號。 基本上我需要的是產品在Java等效此PHP $ PARAMS =陣列( '用戶'=>數組( '姓名'=> '鮑勃史密斯', '姓氏'=>「約翰遜的' )); – 2011-05-09 18:44:26

+0

我已經更新了我的問題,並提供了有關上述答案的其他信息;)感謝您回答BT! – 2011-05-09 18:54:40

+0

好的,我沒有意識到自己有一個Java庫,它將對象圖的等同序列化轉換爲URL查詢參數。 – sudocode 2011-05-10 08:43:50

1

我明白了。這裏的示例代碼:

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

有點討厭,但它的工作。你可能希望得到它更通用 - 這隻適用於1元素的數組。