標籤:android style blog http color io os 使用 ar
Android應用作為一個用戶端程式絕大部分都是需要進行網路請求和訪問的,而http通訊是一種比較常見並常用的通訊方式。
在Android中http網路編程中有兩種實現方式,一種是使用HttpURLConnection,另一種就是使用HttpClient。
這兩種實現方式的大體過程都是:
- Android用戶端向伺服器發出請求。
- 服務端接收請求並響應。
- 服務端返回資料給用戶端。
在Http通訊中有POST和GET兩種方式,其不同之處在於GET方式可以獲得靜態頁面,同時可以將請求參數放在URL字串後面,傳遞給伺服器;而POST方式的參數則是放在Http請求中的。因此,無論你是用哪一種HTTP實現方式都需要明確所使用的請求方式。
下面我們我們先來認識HttpURLConnection:
HttpURLConnection繼承於URLConnection類,二者都是抽象類別。其對象主要通過URL對象的openConnection方法建立,在獲得HttpURLConnection對象之後,預設採用GET方式請求資料,此時即可使用輸入資料流讀取資訊。
樣本如下:(其中strurl為“http://www.baidu.com”)
private HttpURLConnection conn;
URL url = new URL(strurl);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//佈建要求方式conn.setConnectTimeout(6 * 1000);//設定連線逾時的時間conn.setReadTimeout(8000);//設定讀取逾時的毫秒數if (conn.getResponseCode() != 200)//判斷是否請求成功 throw new RuntimeException("運行異常");//擷取伺服器返回的輸入資料流InputStream is = conn.getInputStream();
如果使用POST方式,還需要對一些參數進行設定(包括上面樣本中的一些設定,除此之外還有以下常見設定)。
conn.setConnectTimeout(6 * 1000);//設定連線逾時的時間 conn.setReadTimeout(8000);//設定讀取逾時的毫秒數 conn.setDoOutput(true);//是否允許輸出 conn.setUseCaches(false);//是否使用緩衝 conn.setRequestMethod("POST");//佈建要求方式 conn.setInstanceFollowRedirects(true);//是否自動執行http重新導向 //以下設定一般請求屬性,即網頁的頭部資訊 conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "application/x-www-from-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(data.length));
HttpURLConnection根據使用目的不同,在具體使用時會稍有區別。下面,就常見的幾種應用舉例說明。
- 從Internet擷取網頁,即向URL發送請求,將網頁以流的形式讀回本地。
- 從Internet擷取檔案,即利用HttpURLConnection對象從網路中擷取檔案資料。
- 向Internet發送請求參數,即向伺服器傳遞參數,即向伺服器傳遞參數。
- 向Internet傳送XML資料。(使用HTTP的的方式傳輸檔案,一般檔案大小在5M一下,HTTP通訊方式不適合傳輸大檔案,對大檔案的傳輸最好使用Socket通訊方式,以保證程式的穩定性。)
下面我們以第一種為例:
static String strurl = "http://www.baidu.com";
public static void testHttpUrlConnection() { new Thread(new Runnable() { private HttpURLConnection conn; public void run() { try { URL url = new URL(strurl); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET");//佈建要求方式 conn.setConnectTimeout(6 * 1000);//設定連線逾時的時間 conn.setReadTimeout(8000);//設定讀取逾時的毫秒數 if (conn.getResponseCode() != 200)//判斷是否請求成功 throw new RuntimeException("運行異常"); //擷取伺服器返回的輸入資料流 InputStream is = conn.getInputStream(); String str = convertStreamToString(is); System.out.println("HttpUrlConnection方式"+str); } catch (Exception e) { System.out.println("utils異常"); e.printStackTrace(); } //關閉http連結 conn.disconnect(); } }).start(); }
將流轉換成字串
/** * 將流轉換成字串 * * @param is * @return */ public static String convertStreamToString(InputStream is) { /* * To convert the InputStream to String we use the * BufferedReader.readLine() method. We iterate until the BufferedReader * return null which means there‘s no more data to read. Each line will * appended to a StringBuilder and returned as String. */ BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); }
運行程式,測試結果如下:
擷取網頁成功。
接下來,我們來簡單的認識HttpClient:
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協議的用戶端編程工具包,並且它支援HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
httpClient相比傳統JDK內建的URLConnection,增加了易用性和靈活性。它不僅是用戶端發送Http請求變得容易,而且也方便了開發人員測試介面(基於Http協議的),即提高了開發的效率,也方便提高代碼的健壯性。
我們用HttpClient實現上面HttpURLConnection擷取百度網頁的同樣的功能。
public static void testHtppClient() { new Thread(new Runnable() { @Override public void run() { HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(strurl); HttpResponse response; try { response = client.execute(request); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String str = EntityUtils.toString(response.getEntity()); System.out.println("HtppClient實現方式"+str); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); }
結果如下:
目前,兩種http通訊的最常見的最簡單的使用我們都會了。至於這兩種通訊方式的更進一步的使用,需要我們大家更進一步的學習和理解,加油!
Android之Http網路編程(一)