Джава; HttpURLConnection; Элементы запроса дублируются как `paramName = value, value`. ожидается `paramName = значение` - PullRequest
0 голосов
/ 28 января 2011

У меня очень странная проблема.

Моя компания использует централизованный веб-сервис регистрации пользователей для наших различных свойств.Обычно мы отправляем запрос в веб-сервис через HttpURLConnection с методом запроса GET, устанавливая параметры через qs.В прошлом это работало нормально.

Для другого свойства, которое мы недавно приобрели и подключили к нашему веб-сервису регистрации, HttpURLConnection, похоже, дублирует параметры при отправке.Ожидаемое значение параметра - paramName=value, но вместо этого мы получаем paramName=value, value.Вот как это выглядит в наших журналах:

Примечание: удаление информации, относящейся к моему работодателю и нашим системам.

01-26 15:21:54 [TP-Processor17] INFO  com].[/] - parameter=userName=nameValue65, nameValue65
01-26 15:21:54 [TP-Processor17] INFO  com].[/] - parameter=policyAccepted=true, true

Это, конечно,вызвал ошибку проверки конечной точки и отключил регистрацию пользователя.

Вот представление кода, использованного для создания соединения:

URL url = new URL("http://account-ws.domain.tld/register.action?responseType=json&userName=nameValue65&age=24&country=US&password1=Passw3rt&emailAddress=name@domain.tld&tosAccepted=true&policyAccepted=true");

HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestMethod("GET");
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);

PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(restEndPoint);
ps.close();

Возможно (?) полезная информация:

  • Форма регистрации отправляется сама себе с помощью POST, после чего мы проверяем ее с помощью форм Struts и отправляем запрос в веб-службу, используя значения, возвращаемые классом проверки формы Struts.(Эти значения проверяются на точность еще раз перед отправкой.)
  • Отладочные сообщения Wireshark и log4j указывают, что URL-адрес, отправленный веб-службе, является правильным / что мы ожидаем, с отдельными значениями для каждого параметра.
  • Почтовые поля исходной формы именуются идентично ключам запроса, отправленным вместе с запросом веб-службы.

Пожалуйста, запросите дополнительную информацию, если вы обнаружите, что здесь недостаточно.

Заранее спасибо!:)

1 Ответ

1 голос
/ 29 января 2011

При использовании метода GET строка запроса добавляется в строку URL. Метод GET является методом запроса Http по умолчанию для HttpURLConnection. Вам не нужно явно устанавливать метод запроса на GET.

Метод GET используется для получения содержимого запрошенного URL. Вы не должны писать в выходной поток соединения GET.

Если вы хотите использовать метод POST, вы можете установить его с помощью setRequestMethod("POST"), но я не уверен, нужно ли вам также иметь setDoOutput(true). Однако setDoOutput(true) по умолчанию установит метод запроса на POST, так что вы также можете игнорировать setRequestMethod("POST"). Если вы хотите записать в выходной поток, используя POST, здесь - мой предыдущий ответ о том, как это сделать, используя HttpURLConnection.

Следует отметить, что когда вы делаете POST (или PUT), URL не должен содержать часть запроса. Поскольку у вас есть смесь GET и POST, это может быть причиной вашей проблемы, но я не уверен.

Один из возможных случаев, когда вам нужно использовать и setRequestMethod, и setDoOutput(true), это когда вы хотите сделать Http PUT.

...