POST не работает с моей формой из HttpURLConnection - PullRequest
1 голос
/ 22 июня 2010

Я пытаюсь войти в систему отчетов, используя Java.До сих пор я пробовал МНОГИЕ различные реализации, которые использовали HttpURLConnection.HTML-код, который я пытаюсь опубликовать, сводится к следующему:

<form name="logonForm" method="POST" action="http://remoteserver/logon.object">
<input type="hidden" name="qryStr" value=""> 
<input type="hidden" name="cmsVisible" value="true"> 
<input type="hidden" name="authenticationVisible" value="true"> 
<input type="hidden" name="referer" value="">
<input type="hidden" name="refererFormData" value="">
<input type="hidden" name="isFromLogonPage" value="true">
<input type="text" name="cms" value="xxxxx" class="textfield" id="apsTextEdit">
<input type="text" name="username" value="xxxxx"class="textfield" id="usernameTextEdit">
<input type="text" name="password" value="xxxxx"class="textfield" id="passwordTextEdit">
<select name="authType"id="authenticationSelectBox">
<option selected value='xxxxx'>xxxxx</select>
<input type="submit" name="SUBMIT">
</form>

Я знаю, что эта форма обеспечивает корректный ввод, потому что когда я нажимаю кнопку Отправить в браузере, она регистрирует меня в моей системе отчетов.Тем не менее, я всегда возвращаю вышеупомянутый html как ответ, когда посылаю программный запрос.Примечание. Я пробовал около миллиона реализаций, которые использовали HttpURLRequest.Один пример:

        OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
        wr.write(parameters);
        wr.flush();

        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        String allLines = "";
        while ((line = rd.readLine()) != null) {
            allLines += "\n" + line; // Process line...
        }
        wr.close();
        rd.close();
        return allLines;

Где 'параметры' варьируются от нуля до каждого URL-кодированного параметра из HTML-кода, который я разместил, и соединение (в настоящее время, как я пробовал другие конфигурации) настраивается следующим образом:

        connection = (HttpURLConnection) url.openConnection();
        HttpURLConnection.setFollowRedirects(true);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=" + "UTF-8");
        connection.setUseCaches(false);
        connection.connect();

Я знаю, что детали немного редки, поэтому дайте мне знать, если вам нужна дополнительная информация, и большое спасибо за любой вклад!

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Вы должны убедиться, что вы также взяли name=value пары всех <input type="hidden"> элементов и один <input type="submit">, который вы хотели бы программно "нажать" в строке запроса.Кнопка имеет только имя, но независимо от того, вам нужно передать его.Таким образом, серверная сторона может различать, нажата ли кнопка, и если да, то какая.

Кроме того, если для формы требуется сеанс (он может использовать токен на основе запроса), то вам необходимо поддерживать файлы cookie.и себя тоже.Проверьте и получите Set-Cookie из заголовка первого ответа и установите его в качестве Cookie заголовка последующих запросов.

Для более простой и менее подробной обработки HTTP / форм рассмотрите Apache HttpComponents Client.

См. Также:

1 голос
/ 22 июня 2010

Ваш код может зайти в тупик при определенных обстоятельствах. Вы должны закрыть вывод, прежде чем читать с ввода. Без закрытия потока сервер не знает, что ваш запрос завершен.

Если вам по какой-то причине необходимо оставить вывод открытым, вам необходимо отправить заголовок «Content-length», чтобы сообщить серверу, сколько ожидать.

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

            StringBuilder sb = new StringBuilder(baseUrl);

            for (Parameter p : parameters) {
                    if (sb.length() > 0)
                        sb.append('&');
                    try {
                            sb.append(URLEncoder.encode(p.name, "UTF-8"));
                            if (p.value != null) {
                                sb.append('=');
                                sb.append(URLEncoder.encode(p.value, "UTF-8"));
                            }
                    } catch (UnsupportedEncodingException e) {
                        // Not really possible, throw unchecked exception
                        throw new IllegalStateException("No UTF-8");
                    }
            }

Лучший способ выяснить, какие параметры отправлять, - это зафиксировать след публикации в браузере и посмотреть, как браузер это делает. FireBug / DebugBar - ваши друзья.

...