1. 程式人生 > >HttpClient和HttpURLConnection的區別和案例

HttpClient和HttpURLConnection的區別和案例

HttpURLConnection 物件

1. HttpURLConnection物件需要通過URL類中的openConnection()方法來獲得,它無法直接構造。

HttpsURLConnection urlconn = null;
URL url = new URL(address);
urlconn = (HttpsURLConnection)url.openConnection();

2. HttpURLConnection的connect()函式,實際上只是建立了一個與伺服器的TCP連線,並沒有實際傳送HTTP請求。HTTP請求實際上直到我們獲取伺服器響應資料(如呼叫getInputStream()、getResponseCode()等方法)時才正式傳送出去。並且HttpURLConnection物件的配置都需要在connect()方法執行之前完成。

urlconn = (HttpsURLConnection)url.openConnection();
urlconn.setRequestMethod("GET");
urlconn.setConnectTimeout(5000);
urlconn.setReadTimeout(5000);
urlconn.setUseCaches(false);
urlconn.connect();

3. HttpURLConnection是基於HTTP協議的,其底層通過socket通訊實現。如果不設定超時(timeout),在網路異常的情況下,可能會導致程式僵死而不繼續往下執行。

public HttpURLConnection(URL url, String s, int i){
        this(url, new Proxy(java.net.Proxy.Type.HTTP, 
        InetSocketAddress.createUnresolved(s, i)));
}

4. HTTP正文的內容是通過OutputStream流寫入的, 向流中寫入的資料不會立即傳送到網路,而是存在於記憶體緩衝區中,待流關閉時,根據寫入的內容生成HTTP正文。

5. 呼叫getInputStream()方法時,返回一個輸入流,用於從中讀取伺服器對於HTTP請求的返回資訊。

InputStream inputStream = urlconn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader buff = new BufferedReader(inputStreamReader);
String line = buff.readLine();
while(line != null){
    System.out.println(line);
    line = buff.readLine();
}
inputStream.close();
inputStreamReader.close();
buff.close();

6. 我們可以使用HttpURLConnection.connect()方法手動的傳送一個HTTP請求,但是如果要獲取HTTP響應的時候,請求就會自動的發起,比如我們使用HttpURLConnection.getInputStream()方法的時候,所以完全沒有必要呼叫connect()方法。

HttpClient 物件

HttpClient相比較來說簡化了HttpURLConnection物件對Session、Cookie的處理。

可以說HttpClient就是一個增強版的HttpURLConnection,HttpClient可以做HttpURLConnection物件所有能做的事。

HttpClient是Apache開源組織提供的它是一個簡單的HTTP客戶端,不是瀏覽器,用於傳送HTTP請求,接收HTTP響應。但不會快取伺服器的響應。它只是關注於如何傳送請求、接收響應,以及管理HTTP連線。

HttpClient的使用

使用HttpClient傳送請求、接收響應很簡單,只要如下幾步即可。

1. 建立HttpClient物件,CloseableHttpClient httpclient = HttpClients.createDefault();

2. 如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。

3. 如果需要傳送請求引數,可呼叫HttpGet、HttpPost共同的setHeader()方法或者addHeader()方法來新增請求引數;對於HttpPost物件而言,也可呼叫setEntity(方法來設定請求引數。

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
httpPost.setEntity(entity);

4. 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,執行該方法返回一個HttpResponse。

5. 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;呼叫HttpResponse的getEntity()方法可獲取HttpEntity物件,該物件包裝了伺服器的響應內容。程式可通過該物件獲取伺服器的響應內容。

HttpGet程式碼例項

	public static void main(String[] args) throws Exception {
		// 格式化請求url
        // String cmd=String.format("http://%s:%[email protected]%s",username,password,split[1]);
		
		// 請求地址
	    String url = "https://blog.csdn.net/amosjob/article/details/82775290";
        // 建立預設的客戶端例項  
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 建立get請求例項 
        HttpGet httpGet = new HttpGet(url);
        // 設定頭部資訊
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//      httpGet.addHeader("x-api-key", "XXX");
//      httpGet.addHeader("x-lang", "en-US");
        // 執行GET請求 返回響應實體 
        HttpResponse response = httpclient.execute(httpGet);
        // 獲取響應碼
        int statusCode = response.getStatusLine().getStatusCode();
        // 獲取全部的請求頭
        Header[] allHeaders = response.getAllHeaders();
        System.out.println("響應狀態碼:" + statusCode);
        for (int i = 0; i < allHeaders.length; i++) {
        	 System.out.println("全部的請求頭:" + allHeaders[i]);
		}
        // 獲取響應訊息實體  
        HttpEntity entity = response.getEntity();
        //列印輸出網頁的內容(可刪除)
        if (entity != null) {
        	// 推薦該辦法列印內容
        	System.out.println("響應的內容:"+EntityUtils.toString(entity));
        	
        	// 也可以使用這個方法
            InputStream inputStream = entity.getContent();
            InputStreamReader streamReader = new InputStreamReader(inputStream);
            int line;
            line = streamReader.read() ;
            while (line!= -1) {
                System.out.print((char)line);
                line = streamReader.read() ;
            }
        }
		
	}

HttpPost程式碼例項

	public static void main(String[] args) throws Exception {
		// 請求地址
		String url = "https://passport.csdn.net/account/login";
		// 建立預設的客戶端例項
		CloseableHttpClient httpclient = HttpClients.createDefault();
		// 建立POST物件
		HttpPost httpPost = new HttpPost(url);
		// 傳引數
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("username", "admin"));
		params.add(new BasicNameValuePair("password", "12345"));
		try {
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
			httpPost.setEntity(entity);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 執行GET請求 返回響應實體
		HttpResponse response = httpclient.execute(httpPost);
		// 獲取響應碼
		int statusCode = response.getStatusLine().getStatusCode();
		// 獲取全部的請求頭
		Header[] allHeaders = response.getAllHeaders();
		System.out.println("響應狀態碼:" + statusCode);
		for (int i = 0; i < allHeaders.length; i++) {
			System.out.println("全部的請求頭:" + allHeaders[i]);
		}
		// 獲取響應訊息實體
		HttpEntity entity = response.getEntity();
		// 列印輸出網頁的內容(可刪除)
		if (entity != null) {
			System.out.println("響應的內容:"+EntityUtils.toString(entity));
		}

	}

相關HTTP協議詳解,請點選博主上篇文章連結