下面是我想要做的事情的描述: 我想通過HttpURLConnection發送登錄表單到網站。 所以我首先發送一個GET請求到登錄頁面,檢查它是否存在,並且我還沒有登錄。 當我關閉連接和輸入流後,我正在參數發送。 然後我做一個POST請求實際登錄Android 2.3.x和4.0.3中HttpURLConnection的差異
代碼:
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及以上版本的每個版本中都能正常工作?
謝謝你的回答!但爲什麼當它遵循重定向時,獲取InputStream需要很長時間? – user1557330 2012-07-28 20:19:03
順便說一句,我嘗試了兩種方法,使用和不使用重定向(我手動進行重定向),並且使用更快的W/O(4秒到2分鐘)。 – user1557330 2012-07-28 21:08:44
查看您的WEBSERVER日誌。你可能在某種重定向循環中... – 2012-07-28 23:40:45