標籤:
目錄(?)[-]
- Http Get的使用方式
- 基礎小例子
- Cookie的使用
- 重新導向
- HTTP POST的小例子
- 基礎小例子
文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件,轉載須註明出處:http://blog.csdn.net/flowingflying/
之前我們都是使用HttpClient來進行http串連,在上一次學習中,HttpClient遠比封裝socket要來得複雜,有管理器,有串連池。從Android2.3版本開始,可以是java.net.HttpURLConnection提供更小更輕載的串連服務。具體詳見:http://developer.android.com/reference/java/net/HttpURLConnection.html
Http Get的使用方式基礎小例子
private void httpUrlConnGetTest(){
HttpURLConnection urlConn = null;
try{
URL url = new URL("http://www.android.com/");
/* 【1】 擷取HttpURLConnection的對象。通過調用URL.openConnection(),並將類型適配為HttpURLConnection類型。 如果是處理https,則使用HttpsURLConnecction,相關的代碼參考: http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html */
urlConn = (HttpURLConnection) url.openConnection();
/* 【2】 處理request的header,設定逾時屬性 。 */
urlConn.setRequestProperty("private-Hello", "Hello world!");//加入屬性測試
urlConn.setConnectTimeout(3000); //對應connection timeout
urlConn.setReadTimeout(5000); //對應Socket timeout
/* 【3】 處理request的body。HTTP Get 沒有body,相關的在HTTP POST中示範 */
/* 【4】讀取response。*/
// 【4.1】擷取response code測試
int responseCode = urlConn.getResponseCode();
Log.d("PRO","Response code = " + responseCode);
if(responseCode == HttpURLConnection.HTTP_OK){
Log.d("PRO","測試擷取頭資訊Content-Type:" + urlConn.getContentType()); //【4.2】擷取header資訊測試
// 讀取body
BufferedReader in = new BufferedReader(
new InputStreamReader(
urlConn.getInputStream()));
String line = null;
while((line = in.readLine()) != null ){
Log.d("PRO",line);
}
in.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
/* 【5】 中斷連線。*/
if(urlConn != null)
urlConn.disconnect();
}
}
HttpURLConnection看起來真整個設計更貼近底層的TCP的流概念。從抓包情況看,已經成功地增加自訂的頭欄位:private-Hello: Hello world!。我們可以根據所需屬性,構造http請求訊息。HttpURLConnectoion也支援401的認證,不過現在基本上很少用這種認證方式,SIP還在用。
Cookie的使用
// 通過CookieHander和CookieManager,HttpURLConnection包含一個格外的cookie管理器,以此在client和server件維護一個長期的session。這部分的代碼來自reference。
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
//寫和讀cookie的小例子
HttpCookie cookie = new HttpCookie("lang", "fr");
cookie.setDomain("twitter.com");
cookie.setPath("/");
cookie.setVersion(0);
cookieManager.getCookieStore().add(new URI("http://twitter.com/"), cookie);
重新導向
HttpURLConnection可以自動處理重新導向的情況,對代碼進行修改來進行相關測試。HttpURLConnection最多可支援5次重新導向(估計是防止迴圈),但不能跨scheme,即不能重http重新導向到https,反之亦然,原因很簡單,因為http和https是由不同的類來進行處理。當然瀏覽器是支援跨scheme的重新導向。HttpURLConnection會自動根據302 Found訊息給出的Location資訊進行串連。
URL url = new URL("http://www.google.com/"); //將被重新導向到www.google.com.hk
... ...
/* 4、讀取response */
if(!url.getHost().equals(urlConn.getURL().getHost())) //比較請求的url和實際的url
Log.d("PRO","Redirect to " + urlConn.getURL().getHost());
… …
HTTP POST的小例子基礎小例子
如果設定了setDoOutput(true),這說明是HTTP POST。如果是其他的,例如OPTIONS,HEAD,PUT,DELETE和TRACE,可以通過setRequestMethod(String)來進行設定,無非就是確定status line如何寫。
private void httpUrlConnPostTest(){
HttpURLConnection urlConn = null;
try{
URL url = new URL("http://blog.csdn.net/flowingflying1");//這是個無效的地址,預計回複403
urlConn = (HttpURLConnection) url.openConnection();
/* 【3】 處理request的body */
urlConn.setDoOutput(true); // 設定允許output,即可以帶有request body
// 為了效能更好,應該設定setFixedLengthStreamingMod(int)或者setChunkedStramingMode(int)。如果不設定,request將的帶buffer已經完成body的寫,再發送,這對body資料量大的情況下顯然效率較低。
urlConn.setChunkedStreamingMode(0);
// 通過outstream,寫入body
OutputStream out = new BufferedOutputStream(urlConn.getOutputStream());
String content = "user=myfriend&action=TEST";
out.write(content.getBytes());
out.close();
/* 4、讀取response。*/
if(urlConn.getResponseCode() = HttpURLConnection.HTTP_OK){
BufferedReader in = new BufferedReader(
new InputStreamReader(
urlConn.getInputStream()));
String line = null;
while((line = in.readLine()) != null ){
Log.d("PRO",line);
}
in.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(urlConn != null)
urlConn.disconnect();
}
}
本博文涉及的例子代碼,可以在Pro Android學習:Http service小例子中下載。
相關連結: 我的Android開發相關文章
【轉】 Pro Android學習筆記(七二):HTTP服務(6):HttpURLConnection