#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.