httpClient發送請求

HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論),它不僅是客戶端發送Http請求變得容易,而且也方便了開發人員測試接口(基於Http協議的),即提高了開發的效率,也方便提高代碼的健壯性。因此熟練掌握HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的瞭解會更加深入。

 

一、簡介

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
下載地址: http://hc.apache.org/downloads.cgi

 

 

二、特性

1. 基於標準、純淨的java語言。實現了Http1.0和Http1.1
2. 以可擴展的面向對象的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS協議。
4. 通過Http代理建立透明的連接。
5. 利用CONNECT方法通過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
7. 插件式的自定義認證方案。
8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連接管理器支持多線程應用。支持設置最大連接數,同時支持設置每個主機的最大連接數,發現並關閉過期的連接。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自定義Cookie策略。
12. Request的輸出流可以避免流中內容直接緩衝到socket服務器。
13. Response的輸入流可以有效的從socket服務器直接讀取相應內容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連接。
15. 直接獲取服務器發送的response code和 headers。
16. 設置連接超時的能力。
17. 實驗性的支持http1.1 response caching。
18. 源代碼基於Apache License 可免費獲取。

 

 

三、使用方法

使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。
1. 創建HttpClient對象。
2. 創建請求方法的實例,並指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
3. 如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。
4. 調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個HttpResponse。
5. 調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。

 

 

6. 釋放連接。無論執行方法是否成功,都必須釋放連接

 

四、代碼實例

【Post請求】

package com.vito.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
 * 
 * @author guoxk
 *
 * @version 創建時間 2015年10月30日 下午1:44:41
 *
 * 類描述:發送httpPost請求測試
 *
 */
public class HttpPostTest {
	public static void main(String args[]) {
		// 創建HttpClientBuilder
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// HttpClient
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();

		HttpPost httpPost = new HttpPost("http://tutor.sturgeon.mopaas.com/users/register.html");
		System.out.println(httpPost.getRequestLine());
        // 創建參數隊列  
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
        formparams.add(new BasicNameValuePair("key", "value"));  
        UrlEncodedFormEntity entity;  
        try {  
        	 entity = new UrlEncodedFormEntity(formparams, "UTF-8");  
             httpPost.setEntity(entity);  
			//執行post請求
			HttpResponse httpResponse = closeableHttpClient.execute(httpPost);
			// 獲取響應消息實體
			HttpEntity httpEntity = httpResponse.getEntity();
			// 響應狀態
			System.out.println("status:" + httpResponse.getStatusLine());
			// 判斷響應實體是否爲空
			if (httpEntity != null) {
				System.out.println("contentEncoding:"
						+ entity.getContentEncoding());
				System.out.println("response content:\n"
						+ EntityUtils.toString(httpEntity));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 關閉流並釋放資源
				closeableHttpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}


【Get請求】

package com.vito.test;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
/**
 * 
 * @author guoxk
 *
 * @version 創建時間 2015年10月30日 下午1:44:41
 *
 * 類描述:發送httpGet請求測試
 *
 */
public class HttpGetTest {
	public static void main(String args[]) {
		// 創建HttpClientBuilder
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// HttpClient
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();

		HttpGet httpGet = new HttpGet("http://tutor.sturgeon.mopaas.com/tutor/search");
		System.out.println(httpGet.getRequestLine());
        try {  
			// 執行get請求
			HttpResponse httpResponse = closeableHttpClient.execute(httpGet);
			// 獲取響應消息實體
			HttpEntity httpEntity = httpResponse.getEntity();
			// 響應狀態
			System.out.println("status:" + httpResponse.getStatusLine());
			// 判斷響應實體是否爲空
			if (httpEntity != null) {
				System.out.println("contentEncoding:"
						+ httpEntity.getContentEncoding());
				System.out.println("response content:\n"
						+ EntityUtils.toString(httpEntity));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 關閉流並釋放資源
				closeableHttpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

五、使用的jar包

httpclient-4.5.jar

httpcore-4.4.3.jar

以上jar包下載

 

 

參考資料:

http://www.ibm.com/developerworks/cn/opensource/os-httpclient/

 

發佈了34 篇原創文章 · 獲贊 15 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章