分享知識-快樂本身:HttpClient 訪問 WebService 開放接口

 HttpClient:

場景需求以下:

  一、項目中須要與一個基於HTTP協議的第三方的接口進行對接html

  二、項目中須要動態的調用WebService服務(不生成本地源碼)java

  三、項目中須要利用其它網站的相關數據git

  這些需求可能或多或少的會發生在平時的開發中,針對每種狀況,可能解決方案不止一種。本文使用HttpClient這種工具來說解HttpClient的相關知識,以及如何使用HttpClient完成上述需求。github

HttpClient 不是瀏覽器?

  有人說,HttpClient不就是一個瀏覽器嘛。。。apache

  可能很多人對HttpClient會產生這種誤解,他們的觀點是這樣的:既然HttpClient是一個HTTP客戶端編程工具,那不就至關因而一個瀏覽器了嗎?無非它不能把HTML渲染出頁面而已罷了。編程

  其實HttpClient不是瀏覽器,它是一個HTTP通訊庫,所以它只提供一個通用瀏覽器應用程序所指望的功能子集,最根本的區別是HttpClient中沒有用戶界面,瀏覽器須要一個渲染引擎來顯示頁面,並解釋用戶輸入網頁爬蟲

HttpClient 是什麼?

  HTTP 協議多是如今 Internet 上使用得最多、最重要的協議了,愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。後端

  雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。瀏覽器

  HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。服務器

爲何要用HttpClient,它跟同類產品有什麼區別呢?

1):提到HttpClient,就不得不提jdk原生的URL了。

  jdk中自帶了基本的網絡編程,也就是java.net包下的一系列API。經過這些API,也能夠完成網絡編程和訪問。

  此外,另外一個開源項目jsoup,它是一個簡單的HTML解析器,能夠直接解析指定URL請求地址的內容,它能夠經過DOM方式來取數據,也是比較方便的API。

JSOUP抓取網頁內容:

那既然已經有這些工具了,爲何仍是有好多好多使用HttpClient的呢?

  這裏實際上是有一個錯誤的認識:Jsoup是解析器不假,但它跟HttpClient不是同類產品(相似Hibernate和MyBatis),實際上平常使用一般會用HttpClient配合Jsoup作網頁爬蟲。

HttpClient仍是有不少好的特色(摘自Apache HttpClient官網):

一、基於標準、純淨的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 可免費獲取。

HttpClient 能幹嗎?

  在後端開發過程當中,後端服務不必定部署在一臺服務器上,因此咱們須要一種技術能夠實現後端調用其餘後端的服務,這種調用被稱爲RPC(遠程過程調用),以下圖所示:

HttpClient編寫程序流程總結

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.CookieStoreorg.apache.http.client.config.RequestConfig等等都是採用默認的。

二、建立某種請求方法的實例

  建立某種請求的實例,並指定請求的url,若是是get請求,建立對象HttpGet,若是是post 請求,建立對象HttpPost

  類型的還有 HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, 還有 HttpOptions。分別對應HEADPOST PUTDELETETRACEOPTIONS方法,每一個方法是作什麼的以下表:

能夠看獲得在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):獲取請求結果

  調用CloseableHttpResponsegetAllHeaders()getHeaders(String name)等方法可獲取服務器的響應頭;

  調用CloseableHttpResponsegetEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可經過該對象獲取服務器的響應內容

經過CloseableHttpEntitygetEntity取得實體以後,有兩種處理結果的方法,

方法一:使用EntityUtils來處理。

    該類是官方提供的一個處理實體的工具類,toSting方法將返回的實體轉換爲字符串,

可是官網不建議使用這個,除非響應實體從一個可信HTTP服務器發起和已知是有限長度的。

方法二:使用InputStream來讀取

    由於httpEntity.getContent方法返回的就是InputStream類型。

這種方法是官網推薦的方式,須要記得的是要本身釋放底層資源。

關閉鏈接釋放資源:

Demo 源碼下載:

相關文章
相關標籤/搜索