Отправка данных POST с помощью Java - PullRequest
1 голос
/ 05 декабря 2011

Хорошо, поэтому место, где я работаю, публикует еженедельный график работы в Интернете и, в основном, я хотел бы написать программу (которую я в конечном итоге превращу в приложение для Android, поэтому я пишу программу на Java) для отправкиданные на веб-сайт (мое имя пользователя и пароль), а затем, как только он вошел в систему, чтобы получить график с веб-сайта.Получив расписание, я проанализирую его по событиям (которые я планирую автоматически добавить в календарь своих телефонов как события).

В любом случае, у меня возникли некоторые проблемы с этим.Итак, я сделал небольшую функцию Java для отправки данных POST на веб-сайт, она выглядит следующим образом:

public void test1 (){
    try {

        // First, set the URL to connect to
        String url = "https://mywalmart.com/cleartrust/ct_logon_en.html";

        // Next set the character encoding
        String charset = "UTF-8";

        // Format the query string
        String query = (new String()).format ("auth_mode=%s&user=%s&password=%s&x=%s&y=%s", 
                URLEncoder.encode("basic", charset), 
                URLEncoder.encode("...", charset), 
                URLEncoder.encode("...", charset),
                URLEncoder.encode("111", charset),
                URLEncoder.encode("36", charset));

        // Open a connection to the website, set a 10 second timeout, and set it to POST
        URLConnection connection = new URL(url).openConnection();
        connection.setReadTimeout(10000);
        connection.setDoOutput(true);

        // Mimic Mozilla web browser
        connection.setRequestProperty("Host", "mywalmart.com");
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0");
        connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        connection.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        connection.setRequestProperty("Accept-Encoding", "gzip, deflate");
        connection.setRequestProperty("Connection", "keep-alive");
        connection.setRequestProperty("Referer", "https://.../cleartrust/ct_logon_en.html");

        // Send the POST data to the host
        OutputStream output = null;
        try {
            output = connection.getOutputStream();
            output.write(query.getBytes(charset));
        } finally {
            if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
        }

        // Get the headers sent to us, and display them all.
        Map<String, List<String>> headers = connection.getHeaderFields ();
        for (Map.Entry<String, List<String>> entry : headers.entrySet ())
        {
            String key = entry.getKey ();
            for (String value : entry.getValue ())
                System.out.println (key + ": " + value);
        }

        // Get the input stream for the HTML portion
        InputStream response = connection.getInputStream();
        Scanner in = new Scanner (response);

        // Display all of the HTML
        while (in.hasNextLine()) {
            System.out.println (in.nextLine ());
        }
    } catch (IOException ex) {
        Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Форма на веб-сайте, к которой я пытаюсь имитировать соединение, такова (исключая некоторые бесполезные

теги и т. д.):
<form name="ctlogonform" action="ct_logon_en.html" method="post" accept-charset="UTF-8">
    <input type="hidden" name="auth_mode" value="basic" />
    <input type="text" name="user" />
    <input type="password" name="password" />
    <input type="image" src="images/btnLogin.jpg" />
</form>

Теперь все, что возвращается при запуске программы, это:

null: HTTP/1.1 200 OK
Content-Length: 8069
Content-Type: text/html

, за которым следует стандартный HTML-кодвеб-страница.

Итак, я создал тестовую веб-страницу PHP со следующим кодом:

<html>
  <head>
    <title>POST Test</title>
  </head>
  <body>
    All header data:<br>
<?php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}
?><br>
    All variables set via POST are here:<br>
<?php 
foreach($_POST as $vblname => $value) echo $vblname . ' = ' . $value . "<br>\n"; 
?>
  </body>
</html>

И, если я запускаю тот же сценарий, что и выше, за исключением созданной страницы PHP, Я получаю следующее:

null: HTTP/1.1 200 OK
Date: Mon, 05 Dec 2011 02:36:48 GMT
Content-Length: 1268
Connection: close
Content-Type: text/html
Server: Apache
X-Powered-By: PHP/5.2.17
<html>
  <head>
    <title>POST Test</title>
  </head>
  <body>
    All header data:<br>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0<br>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br>
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br>
Accept-Encoding: gzip, deflate<br>
Referer: https://mywalmart.com/cleartrust/ct_logon_en.html<br>
Host: bf-test.horizon-host.com<br>
Connection: keep-alive<br>
Content-type: application/x-www-form-urlencoded<br>
Content-Length: 60<br>
<br>
    All variables set via POST are here:<br>
auth_mode = basic<br>
user = ...<br>
password = ...<br>
x = 111<br>
y = 36<br>
  </body>
</html>

Итак, это говорит о том, что я успешно отправляю данные POST и правильно устанавливаю свои заголовки, единственная проблема в том, что веб-сайт, который использует моя работа, неили не отправляю на правильный веб-сайт.Я попробовал оба https://mywalmart.com/cleartrust/ct_logon_en.html и https://mywalmart.com/ct_logon_en.html,, но они оба делают одно и то же, и это не отправляет мне перенаправление.

Итак, теперь все это охвачено!Мой вопрос заключается в том, как я могу успешно отправить данные POST на веб-сайт, чтобы имитировать веб-браузер, чтобы я мог получить доступ к странице, которая обычно будет доступна после успешного входа в систему?

(также я поставил'...' в разных местах, таких как URL моего рабочего сайта, мое имя пользователя / пароль и т. д.)

(Обновление: я замаскировал mywalmart.com с помощью ... ...Однако я понял, что с помощью простого поиска в Google «ct_logon_en.html» вы сможете найти исходный URL-адрес, поэтому у меня нет реальной причины пытаться его скрыть.)

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Это должно ответить на ваш вопрос ..

http://hc.apache.org/httpcomponents-client-ga/primer.html.

Попробуйте использовать клиентскую библиотеку http.Это гораздо более надежная библиотека.

0 голосов
/ 05 декабря 2011

Во-первых, я попытался бы перейти по URL, который не является https (возможно, тем, который вы контролируете), а затем шпионить за выводом с помощью Wireshark.Нажмите его в своей программе и в браузере и убедитесь, что вы правильно кодируете данные своей формы.

Если проблема не в этом, то я бы предпочел куки-файлы, но это всего лишь предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...