2012-07-27 164 views
2

下面是我想要做的事情的描述: 我想通過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及以上版本的每個版本中都能正常工作?

回答

3

在4.0.3中,自動爲您處理重定向(這就是爲什麼您甚至沒有看到302響應代碼)。

getInstanceFollowRedirects方法(或getFollowRedirects靜態方法)HttpURLConnection類可以用來查看是否自動跟蹤重定向。與他們對應的設置器對應設備(setInstanceFollowRedirects或靜態setFollowRedirects)可以更改此行爲。

+0

謝謝你的回答!但爲什麼當它遵循重定向時,獲取InputStream需要很長時間? – user1557330 2012-07-28 20:19:03

+0

順便說一句,我嘗試了兩種方法,使用和不使用重定向(我手動進行重定向),並且使用更快的W/O(4秒到2分鐘)。 – user1557330 2012-07-28 21:08:44

+0

查看您的WEBSERVER日誌。你可能在某種重定向循環中... – 2012-07-28 23:40:45

相關問題