В 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 ..... но я знаю, что могут быть и другие.