私がやろうとしていることの説明は次のとおりです。HttpURLConnectionを介してログインフォームをWebサイトに送信したいと思います。そのため、まずログインページにGETリクエストを送信して、ログインページが存在し、まだログインしていないことを確認します。接続と入力ストリームを閉じた後、次のパラメータを作成します。送信。次に、実際にログインするためのPOSTリクエストを作成しています。
コード:
url = new URL("http://www.example.com/login/");
con = (HttpURLConnection) url.openConnection();
in = con.getInputStream();
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
loginData = getResponseData(in); // InputStream to String
in.close();
if(isBlank(loginData)){
return StatusCode.CONNECTION_FAILED; // no login page
}
if (Login.getLoginStatus(loginData)) {
return StatusCode.NO_ERROR; // already logged in
}
}
con.disconnect();
String params = "password="+URLEncoder.encode(login.second,"UTF-8")+
"&username="+URLEncoder.encode(login.first,"UTF-8");
url = new URL("http://www.example.com/login/login.php");
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setFixedLengthStreamingMode(params.getBytes().length);
out = con.getOutputStream();
out.write(params.getBytes());
out.close();
in = con.getInputStream(); \\ THIS IS WHERE IT GETS STUCK
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
loginData = getResponseData(in);
in.close();
if(isBlank(loginData)){
return StatusCode.CONNECTION_FAILED; // no login page
}
if (Login.getLoginStatus(loginData)) {
return StatusCode.NO_ERROR; // logged in
}
if (loginData.contains("Invalid username and//or password.")) {
return StatusCode.WRONG_LOGIN_DATA; // wrong login
}
}
con.disconnect();
バージョン2.3.xでは、応答コード302が返され、InputStreamにデータがありません(con.getInputStream()
非常に高速です)。Eclipseデバッグモードですべてのヘッダーを確認できます。
バージョン4.0.3では、応答コード200、InputStream内のすべてのデータ(con.getInputStream()
約2分間スタックしている)を返し、デバッグモードでは次のように読み取ることができます。
con.ResponseCode = -1
con.ResponseMessage = null
con.redirectionCount = 1
なぜ違いがあるのか、2.3.x以降のすべてのバージョンでどのように機能させることができるのか知っていますか?