Java/Android的HTTP POST数组参数

3

在 PHP 中构建 HTTP POST 查询时,可以使用一个称为 http_build_query 的简单方法,该方法基于传递给函数的数组返回以下内容:

简单数组:

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

希望有人知道如何实现这个 :) 祝好, Morten
编辑:
基本上我需要生成Java版本的这个PHP代码:
$params = array('user' => array(
    'firstname' => 'Bob Smith',
    'lastname' => 'Johnson'
));

以下是相同请求的JSON格式:

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

我只需要以application/x-www-form-urlencoded格式提供Java等效代码;)

顺便说一句,非常感谢您回答伪代码,真的很感激!


代码似乎是正确的。哪里出了问题? - ewan.chalmers
我正在发布的实体似乎是:“user=&firstname=admin&lastname=admin”,但我的服务对此没有很好的响应;)我需要的是:user%5Bfirstname%5D=admin&user%5Blastname%5D=admin。 - Morten Nielsen
你想让你的参数名称被URL编码的 '[' 和 ']' 包围吗?这不是你的PHP函数输出的怪癖,而是标准编码输出吗? - ewan.chalmers
@MortenNielsen,我不确定(还没有测试),但这可能是答案?http://www.java-forums.org/new-java/37065-serialize-array-java-unserialize-php.html#post168391 - user942821
2个回答

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

有点恶心,但是它有效。你可能想让它更通用一些——这只适用于单元素数组。

0

我认为你的代码是正确的,但你对它应该产生什么输出的期望是错误的。我不认为你应该期望你的参数名称被方括号(urlencoded:%5B和%5D)包围。

如果你需要这个,那么你需要在你的Java代码中添加括号,例如:

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

啊,这当然可能是个问题。我目前为了测试使用了PHP的http_build_query和Curl来进行POST请求。我还尝试使用Chrome插件“XHR Poster”和Firefox的等效插件“Poster”。使用上述参数(由PHP生成)可以正常工作。因此,我预计该服务需要括号。基本上,我需要生成与此PHP代码相当的Java代码: $params = array('user' => array( 'firstname' => 'Bob Smith', 'lastname' => 'Johnson' )); - Morten Nielsen
我已经更新了我的问题,并提供了一些关于你上面回答的额外信息 ;) 感谢你的回答! - Morten Nielsen
好的,我不知道有没有一个Java库可以将对象图序列化为URL查询参数。 - ewan.chalmers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接