Параметры массива HTTP POST для Java / Android

#java #android #http

#java #Android #http

Вопрос:

При создании HTTP POST запроса в PHP я могу использовать простой метод с именем: http_build_query, который вернет следующее на основе массива, переданного функции:

Простой массив:

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

ВОЗВРАТ:

 flags_0=fooamp;flags_1=baramp;flags_2=bazamp;flags_3=boomamp;cow=milkamp;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[name%5D=Bob Smithamp;user[age%5D=47amp;user[sex%5D=Mamp;user[dob%5D=5/12/1956amp;pastimes[0%5D=golfamp;pastimes[1%5D=operaamp;pastimes[2%5D=pokeramp;pastimes[3%5D=rapamp;children[bobby%5D[age%5D=12amp;children[bobby%5D[sex%5D=Mamp;children[sally%5D[age%5D=8amp;children[sally%5D[sex%5D=Famp;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 в формате application / x-www-form-urlencoded 😉

КСТАТИ. Большое спасибо за ответ на sudocode, действительно оцените это!

Комментарии:

1. Код кажется правильным. Что не работает?

2. Объект, который я публикую, похоже, выглядит так: «user =amp;firstname =admin amp; lastname = admin», на который мой сервис плохо реагирует 😉 Мне нужно: user[firstname]=admin amp;user[lastname% 5D=admin

3. Вы хотите, чтобы имена ваших параметров были окружены URL в кодировке ‘[‘ и ‘]’? Разве это не особенность вывода вашей функции PHP, а не стандартная кодировка?

4. @MortenNielsen, я не уверен (еще не проверял), но это может быть ответом? java-forums.org/new-java /…

Ответ №1:

Я понял. Вот пример кода:

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

Немного неприятно, но это работает. Возможно, вы захотите сделать его немного более общим — это только для массива из 1 элемента.

Ответ №2:

Я думаю, что ваш код правильный, но ваше ожидание того, какой результат он должен выдавать, неверно. Я не думаю, что вам следует ожидать, что имена ваших параметров будут заключены в квадратные скобки (urlencoded: [ и ]).

Если вам это нужно, то вам нужно будет добавить скобки в ваш Java-код, например

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

Комментарии:

1. Ах, это может быть причиной. Что я до сих пор делал для тестирования, так это использовал http_build_query PHP и Curl для выполнения post-запроса. Я также пробовал использовать плагин Chrome с именем «XHR Poster» и эквивалент firefox «Poster». С параметрами, как описано выше (сгенерированными из PHP), это работает. Итак, я ожидал, что сервису «понадобятся» скобки. В принципе, что мне нужно, так это создать Java-эквивалент этого PHP $params = array(‘user’ => array( ‘firstname’ => ‘Bob Smith’, ‘lastname’ => ‘Johnson’));

2. Я обновил свой вопрос некоторой дополнительной информацией относительно вашего ответа выше 😉 Спасибо за ответ, bt!

3. Хорошо, я сам не знаю о библиотеке Java, которая выполняет эквивалентную сериализацию графа объекта в параметры запроса URL.