最近在做乙個網路診斷功能,檢測外網連通性,測試位址是
測試方法:
httpurlconnection進行網路連線訪問,根據訪問返回的http狀態碼是否為200,確定外網是否連通。測試**:
int rescode = -1;
try
});sslcontext sslctx = sslcontext.getinstance("ssl");
sslctx.init(null, new trustmanager, new securerandom());
if (sslctx != null)
}conn.setrequestmethod("get");
conn.setconnecttimeout(timeoutmillis);
conn.connect();
rescode = conn.getresponsecode(); // 獲取get請求responsecode
} catch (exception e) finally
}
測試結果:大部分裝置上該方式處理沒有問題,在極少的幾個裝置上,發現永遠是非200的狀態碼。但是本身也是可以連線外網的,訪問沒有問題。
分析:
在瀏覽器輸入進行抓包或者通過瀏覽器f12檢視network訪問,如下圖,
訪問後,伺服器吐回狀態碼302 ,然後locatioin欄位標識瀏覽器應該跳轉到了 。
那之前的**健壯性不強,沒有考慮到302跳轉場景,怎麼來規避呢?
開始時候,想的是使用簡單的方式達到效果,翻閱了的httpsurlconnection 類的所有方法,存在這個方法:
/**
* sets whether this connection follows redirects.
** @param followredirects
* if this connection will follows redirects, false
* otherwise.
*/public void setinstancefollowredirects(boolean followredirects)
從這個方法來看,貌似是可以設定是否支援重定向訪問,所以這樣設定:
conn.setinstancefollowredirects(true);
結果,訪問302的位址還是失敗,根本不會自動跳轉訪問。也不清楚具體原因,估計要看原始碼了,所以換了方式處理該問題;
方式1: 解析http請求返回的location,進行重新訪問請求
示例**:
}方式2:使用androidhttpclient進行網路訪問通過設定clientpnames.handle_redirects為true,來達到重定向請求功能。
ps:defaulthttpclient是預設支援http get的重定向訪問,也可以直接用該類實現請求。post還是不支援的。
public static int getresponsecode(string urlstr, int timeoutmillis) catch (exception e) finally
}
302跳轉本身是比較常見的一種訪問訪問結果,在寫網路請求時候,需要考慮,並且選擇合適的方式來處理,增強**健壯性。 Android學習 Http請求
今天繼續學習網路程式設計模組。首先是webview,簡單的來訪問網頁 在這之前先要什麼訪問網路的許可權 android name android.permission.internet 實現在layout中新建webview元件,然後在activity中新建webview物件,然後呼叫setwebv...
android 原生http請求
向指定 url 傳送post方法的請求 param url 傳送請求的 url param param 請求引數,請求引數應該是 name1 value1 name2 value2 的形式。return 所代表遠端資源的響應結果 public static string sendpost strin...
Android學習 HTTP請求
一 使用httpurlconnectionurl url new url httpurlconnection connection httpurlconnection url.openconnection 在得到httpurlconnection的例項後,設定http請求所使用的方法 get和pos...