1. 程式人生 > >HttpURLConnection呼叫getResponseCode()時丟擲IOException異常

HttpURLConnection呼叫getResponseCode()時丟擲IOException異常

Android開發中,我們經常會使用HttpURLConnection類來發出網路請求,請求發出後,一般都會使用getResponseCode()來獲取伺服器返回的HTTP狀態碼,以便判斷請求是否成功,諸如200、500、404之類的狀態碼使用getResponseCode()來獲取是沒有問題的,但是如果狀態碼是401,同時你使用的又是4.1.x/4.2.x/4.3.x的安卓系統的話,那麼getResponseCode()可能會丟擲IOException異常:

java.io.IOException: No authentication challenges found

之所以會出現這個問題,是因為伺服器在返回401的時候,沒有同時在header中設定“WWW-Authenticate

”響應頭,這個響應頭的作用是告訴客戶端,伺服器需要哪種型別的認證(Basic或者Digest),通常這個響應頭對客戶端來說沒什麼作用,但是標準就是這麼規定的。如果伺服器沒返回這個響應頭,那麼客戶端在解析的時候就會找不到這個header而導致丟擲異常。

解決這個問題的方法有兩種:

1)從伺服器入手,在返回資訊的時候,伺服器設定一個假的“WWW-Authenticate”響應頭,比如:WWW-Authenticate: Basic realm="fake",或者遇到未授權的請求時,直接返回403,而不是返回401;

2)從客戶端入手,修改程式碼,在獲取響應碼的時候捕捉異常:

HttpURLConnection connection = ...;
try {
    connection.getResponseCode(); 
} catch (IOException e) {
    int responsecode = connection.getResponseCode(); 
}

如果getResponseCode()丟擲IOException,那麼在捕獲異常後,再次獲取響應碼,這時候就可以正常獲取到了,so,就是這麼簡單。