Java httpPost в форме .asp - PullRequest
0 голосов
/ 19 июля 2011

В Java, если я хочу отправить данные в форму на сервере, где тип формы:

 <form method="post" id="form1" name="form1" action="">
 <div id="login" class="box">
  <div class="header">Log in</div>
  <div class="content">
   <label for="txtUser">User:</label>
   <input id="txtUser" name="txtUser" type="text" size="13" value="" />
   <label for="txtPassword">Password:</label>
   <input id="txtPassword" name="txtPassword" type="password" size="13" value="" />
   <input id="BLogin" name="BLogin" type="submit" value="Log in"  />
  </div>
  <div class="footer">
   <input type="checkbox" id="chkSave" name="chkSave"   /> <label for="chkSave">Save account</label>
  </div>
 </div>
 </form>

в этом случае я должен использовать метод HttpPost, так как форма принимает метод "post", как указано в определении формы (инициализация):

<form method="**post**" id="form1" name="form1" action="">

В моем примере (решение для Android) я использую

__VIEWSTATE
__EVENTTARGET
__EVENTARGUMENT
ctl00$tbUsername
ctl00$tbPwd
ctl00$chkRememberLogin
ctl00$cmdLogin

значений, поскольку они являются единственными, которые требуются серверу для создания сообщения. Где я могу найти то, что требуется серверу в том случае, если вы не запрограммировали сервер? Я использую программное обеспечение WireShark, чтобы просмотреть все входящие ответы или исходящие запросы между клиентом и сервером, просто используйте http filter , чтобы видеть только транзакции http. Затем используйте любой браузер для входа в систему обычным способом, как вы делаете это онлайн, а затем в WireShark вы увидите все запросы и ответы между вашим браузером и сервером. Найдите тот, который вас интересует, по известному IP-адресу или адресу хоста, а затем скопируйте читаемые байты , которые вы найдете, если щелкнуть правой кнопкой по любой из транзакций. Поэтому, когда вы это сделаете, вы обнаружите, как должен выглядеть ваш запрос к серверу, и какие значения необходимы. Вернуться к кодированию (Java):

public HttpResponse httpPost1(String viewstateValue, String url, String username, String password)
            throws ConnectTimeoutException {
            try {
                // --------post
                HttpPost httppost = new HttpPost(url);

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("__VIEWSTATE",
                        viewstateValue));
                nameValuePairs.add(new BasicNameValuePair("__EVENTTARGET", ""));
                nameValuePairs
                        .add(new BasicNameValuePair("__EVENTARGUMENT", ""));

                nameValuePairs.add(new BasicNameValuePair("ctl00$tbUsername",
                        username));
                nameValuePairs.add(new BasicNameValuePair("ctl00$tbPwd", password));
                nameValuePairs.add(new BasicNameValuePair(
                        "ctl00$chkRememberLogin", "0"));
                nameValuePairs.add(new BasicNameValuePair("ctl00$cmdLogin",
                        "Login"));
                // nameValuePairs.add(new
                // BasicNameValuePair("ctl00$cmdForgetMe",
                // "Forget Me"));

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                response = client.execute(httppost);

                String responseHtml = EntityUtils.toString(response
                        .getEntity());
                // System.out.println(responseHtml);
                // System.out.println(response1.getStatusLine());

            } catch (ClientProtocolException e) {
            } catch (IOException e) {
            }

        return response;
    }

Здесь я публикую значения на URL, который я знаю заранее.

Вы можете добавить заголовки, используя

httppost.addHeader("Referer",
                    "http://website/login.asp");

или значение времени ожидания для запроса

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            int timeoutConnection = 5000;
            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters,
                    timeoutConnection);

В этом случае лучше перехватить исключения, если истекло время ожидания, и повторить запрос, как рекомендуется в документации HttpClient.

HttpClient по умолчанию выполняет перенаправления, но можно перехватывать каждый раз, когда происходит перенаправление, используя:

private RedirectHandler customRedirectHandler;

........
(maybe constructor..)
    client.setRedirectHandler(customRedirectHandler);
........
class CustomRedirectHandler extends DefaultRedirectHandler {
        @Override
        public boolean isRedirectRequested(HttpResponse response,
                HttpContext context) {
            // System.out.println("isRedirectRequested");

            return true;
        }

        @Override
        public URI getLocationURI(HttpResponse response, HttpContext context)
                throws ProtocolException {

            String location = response.getLastHeader("Location").getValue();

            if (location.contains("Login")) {
                // System.out.println("Login needed");
            } else {
                // System.out.println("No login required");
            }

            URI redirectURI = null;
            try {
                redirectURI = new URI(location);
            } catch (URISyntaxException e) {
            }

            return redirectURI;
        }
    }
}

и затем, выполнив все необходимое с клиентом, вы можете разорвать соединение с клиентом:

public void shutDownClient() {
    client.getConnectionManager().shutdown();
}

Это пример HttpClient , не забывайте, что вы также можете использовать UrlConnection , здесь показаны различия:

http://www.innovation.ch/java/HTTPClient/urlcon_vs_httpclient.html

Так что это зависит от того, что вы предпочитаете использовать и что больше подходит для вашего проекта.

P.S. Это решение POST применяется к моему проекту, но оно может не сработать для вашего. Сначала используйте Wireshark, а затем посмотрите, какие запросы необходимо отправлять на сервер. В моем случае это было похоже на viewstate = sdsgdgdfd323 & username = dsfngkjfdg & password = dsfsdfsfs ..... но я знаю, что могут быть и другие.

1 Ответ

0 голосов
/ 19 июля 2011

Независимо от того, принимает ли URL PUT вместо POST, полностью зависит от сервера.

Большинство серверов, ожидающих POST, будут принимать только POST.PUT используется гораздо реже.

...