一、項目中須要與一個基於HTTP協議的第三方的接口進行對接html
二、項目中須要動態的調用WebService服務(不生成本地源碼)java
三、項目中須要利用其它網站的相關數據git
這些需求可能或多或少的會發生在平時的開發中,針對每種狀況,可能解決方案不止一種。本文使用HttpClient這種工具來說解HttpClient的相關知識,以及如何使用HttpClient完成上述需求。github
有人說,HttpClient不就是一個瀏覽器嘛。。。apache
可能很多人對HttpClient會產生這種誤解,他們的觀點是這樣的:既然HttpClient是一個HTTP客戶端編程工具,那不就至關因而一個瀏覽器了嗎?無非它不能把HTML渲染出頁面而已罷了。編程
其實HttpClient不是瀏覽器,它是一個HTTP通訊庫,所以它只提供一個通用瀏覽器應用程序所指望的功能子集,最根本的區別是HttpClient中沒有用戶界面,瀏覽器須要一個渲染引擎來顯示頁面,並解釋用戶輸入網頁爬蟲
HTTP 協議多是如今 Internet 上使用得最多、最重要的協議了,愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。後端
雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。瀏覽器
HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。服務器
1):提到HttpClient,就不得不提jdk原生的URL了。
jdk中自帶了基本的網絡編程,也就是java.net包下的一系列API。經過這些API,也能夠完成網絡編程和訪問。
此外,另外一個開源項目jsoup,它是一個簡單的HTML解析器,能夠直接解析指定URL請求地址的內容,它能夠經過DOM方式來取數據,也是比較方便的API。
這裏實際上是有一個錯誤的認識:Jsoup是解析器不假,但它跟HttpClient不是同類產品(相似Hibernate和MyBatis),實際上平常使用一般會用HttpClient配合Jsoup作網頁爬蟲。
一、基於標準、純淨的java語言。實現了HTTP1.0和HTTP1.1;
二、以可擴展的面向對象的結構實現了HTTP所有的方法(GET, POST等7種方法);
三、支持HTTPS協議;
四、經過HTTP代理創建透明的鏈接;
五、利用CONNECT方法經過HTTP代理創建隧道的HTTPS鏈接;
六、Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案;
七、插件式的自定義認證方案;
八、便攜可靠的套接字工廠使它更容易的使用第三方解決方案;
九、鏈接管理器支持多線程應用;支持設置最大鏈接數,同時支持設置每一個主機的最大鏈接數,發現並關閉過時的鏈接;
十、自動處理Set-Cookie中的Cookie;
十一、插件式的自定義Cookie策略;
十二、Request的輸出流能夠避免流中內容直接緩衝到socket服務器;
1三、Response的輸入流能夠有效的從socket服務器直接讀取相應內容;
1四、在HTTP1.0和HTTP1.1中利用KeepAlive保持持久鏈接;
1五、直接獲取服務器發送的response code和 headers;
1六、設置鏈接超時的能力;
1七、實驗性的支持HTTP1.1 response caching;
1八、源代碼基於Apache License 可免費獲取。
在後端開發過程當中,後端服務不必定部署在一臺服務器上,因此咱們須要一種技術能夠實現後端調用其餘後端的服務,這種調用被稱爲RPC(遠程過程調用),以下圖所示:
POM:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
流程:
一、建立HttpClient對象
這兒使用的是org.apache.http.impl.client.CloseableHttpClient,他是HttpClient接口的一個實例,建立該對象的最簡單方法:CloseableHttpClient client = HttpClients.createDefault();
HttpClients是建立CloseableHttpClient的工廠,採用默認的配置來建立實例,通常狀況下咱們就用這個默認的實例就足夠,後面咱們能夠去看下怎麼定製本身需求配置的來建立HttpClient接口的實例。若是你去看這個函數的源代碼,你能夠看到
org.apache.http.client.CookieStore,org.apache.http.client.config.RequestConfig等等都是採用默認的。
二、建立某種請求方法的實例
建立某種請求的實例,並指定請求的url,若是是get請求,建立對象HttpGet,若是是post 請求,建立對象HttpPost。
類型的還有 HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, 還有 HttpOptions。分別對應HEAD、POST PUT、DELETE、TRACE、OPTIONS方法,每一個方法是作什麼的以下表:
能夠看獲得在Http協議中,只有post方法和put方法的請求裏面有實體
三、若是有請求參數的話,Get方法直接寫在url後面,例如
或者使用setParameter來設置參數:
使用 URIBuilder 對路徑請求信息進行封裝。
http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
POST 請求也可使用 此方式進行攜帶參數。(攜帶參數有多種)
在介紹另外幾種:
3):發送請求
調用CloseableHttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個CloseableHttpResponse對象。
CloseableHttpResponse response = client.execute(httpPost);
很明顯CloseableHttpResponse就是用了處理返回數據的實體,經過它咱們能夠拿到返回的狀態碼、首部、實體等等咱們須要的東西。
4):獲取請求結果
調用CloseableHttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;
調用CloseableHttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可經過該對象獲取服務器的響應內容
經過CloseableHttpEntity的getEntity取得實體以後,有兩種處理結果的方法,
方法一:使用EntityUtils來處理。
該類是官方提供的一個處理實體的工具類,toSting方法將返回的實體轉換爲字符串,
可是官網不建議使用這個,除非響應實體從一個可信HTTP服務器發起和已知是有限長度的。
方法二:使用InputStream來讀取
由於httpEntity.getContent方法返回的就是InputStream類型。
這種方法是官網推薦的方式,須要記得的是要本身釋放底層資源。
關閉鏈接釋放資源: