HTTP POST из Java-приложения

Я пытаюсь отправить POST в html-форму с помощью java-приложения. Форма находится на странице с расширением html, если это имеет значение (например, http://www.domain.tld/somepage.html), содержащий следующую форму:

<Form method="POST">
<input type="hidden" name="op" value="checkfiles">
<Textarea name="list" rows=12 style="width:100%;font:12px Arial"></Textarea>
<br><input type="submit" name="process" value="Check">
</Form>

Я пытался использовать Apache HTTPComponents, но пока мои попытки не увенчались успехом. Вот функция, которую я использую:

private static void submit(String text) throws Exception{

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.domain.tld/somepage.html");

    List <NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("list", text));

    httppost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

    HttpResponse response = httpclient.execute(httppost);

    BufferedReader rd = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));

    StringBuffer result = new StringBuffer();
    String line = "";
    while ((line = rd.readLine()) != null) {
        result.append(line);
    }

    System.out.println(result.toString());

}

По какой-то причине это возвращает мне страницу по адресу http://www.domain.tld/. Помогите, пожалуйста.


person nmpg    schedule 11.11.2014    source источник


Ответы (2)


Для начала (но не имеет отношения к вопросу) используйте EntityUtils.toString(), чтобы получить содержимое страницы как String вместо того, чтобы читать его вручную. Не забудьте также использовать сущность с EntityUtils.consume() для высвобождения ресурсов (подключения к пулу и т. д.).

Что касается вопроса, ваш код выглядит просто отлично. По моему опыту, страница, на которую вы отправляете, перенаправляет вас на главную страницу по разным причинам. Некоторые, о которых я могу думать,

  1. Параметры вашего сообщения неверны - удаленная система угрожает вашему запросу некорректным и перенаправляет вас на главную страницу (это нормально)
  2. У вас отсутствуют некоторые входные параметры, которые должны быть проанализированы со страницы (например, __VIEWSTATE для систем .NET).
  3. Вы должны сначала GET свою страницу инициализировать сеанс - например. получать файлы cookie сеанса и т. д.
  4. Вы публикуете не на той веб-странице
  5. У вашего клиента нет некоторых заголовков, например. имя клиента

Могут быть и другие проблемы, но это самые распространенные, с которыми я сталкивался. В своей практике я внедрил менеджеры страниц для десятков веб-сайтов. Вы должны проанализировать, как пост выполняется из веб-браузера. Я настоятельно рекомендую использовать Firefox с расширением Firebug и дважды проверить, что происходит. По сути, вам почти всегда нужно воссоздавать точное поведение браузера, включая чтение страниц, инициализацию сеансов, хранение файлов cookie и т. д.

ИЗМЕНИТЬ

Ваша форма имеет 3 входа, но вы отправляете только list. Попробуйте также отправить поля op и (необязательно) process.

person Antoniossss    schedule 11.11.2014
comment
добавлен params.add(new BasicNameValuePair(op, checkfiles)); и теперь это работает. спасибо! - person nmpg; 12.11.2014

Вы не можете POST в веб-форму с помощью Apache HttpComponents/HttpClient. Эта библиотека предназначена для POST-данных через HTTP-протоколы, а НЕ для ввода данных в форму, что подразумевает манипулирование/взаимодействие с DOM. Например, хороший вопрос: если HttpComponents можно использовать для ввода данных формы, есть ли у него метод «Click», который позволит вам щелкнуть кнопку (например, кнопку «Отправить» в форме)?

Если вы действительно хотите использовать автоматизацию для ввода данных в форму, попробуйте использовать другие библиотеки, которые взаимодействуют с DOM, или даже Selenium Webdriver, который является отраслевым стандартным способом взаимодействия с веб-элементами.

Некоторая документация по Selenium, которая может помочь:

http://docs.seleniumhq.org/projects/webdriver/ Selenium Webdriver: ввод текста в текстовое поле

Надеюсь это поможет! :)

person Rubicon    schedule 11.11.2014
comment
О чем ты говоришь? OP пытается выполнить POST, а не автоматизировать его из браузера... я ошибаюсь? - person Antoniossss; 12.11.2014
comment
Я неправильно понял его самое первое утверждение: я пытаюсь отправить POST в html-форму с помощью java-приложения. Форма находится на странице.... Я думал, что он пытается динамически заполнить поля формы, но это явно не так. Спасибо за исправление. - person Rubicon; 12.11.2014