發送http請求(1):發送http請求的幾種方式

推薦閱讀:java

SpringCloud源碼閱讀0-SpringCloud必備知識apache

SpringCloud源碼閱讀1-EurekaServer源碼的祕密設計模式

SpringCloud源碼閱讀2-Eureka客戶端的祕密緩存

SpringCloud源碼閱讀3-Ribbon負載均衡(上)服務器

發送HTTP請求在咱們開發中是一件很是廣泛的事情。app

發送http請求的方式

最基礎

1.1 Socket(最基礎)

Socket(最基礎) 客戶端與服務器的鏈接歸根結底都是socket鏈接,在Java中就是客戶端的Socket與服務器端的ServerSocket進行鏈接.負載均衡

本身使用原生Socket,來實現。 複雜繁瑣,易出錯.框架

因而乎,就出現了咱們所說的輪子。socket

輪子

2.1 HttpURLConnection(JDK原生)

java.net.HttpURLConnection是JDK提供的訪問HTTP協議的基本功能的類。工具

java.net.HttpURLConnection繼承自java.net.URLConnection,差異在與HttpURLConnection僅僅針對Http鏈接。

java.net.HttpURLConnection 與java.net.URLConnection 都是抽象類,不能實例化。JDK中的sun.net.www.protocol.http.HttpURLConnection 繼承了java.net.HttpURLConnection,提供了對請求發送的實現。

HttpURLConnection 在處理 Session,Cookie等方面處理難度大,

2.2 HttpClient(apache公司家的)

HttpClient是Apache公司出的用於發送http請求的工具類。底層確定也是封裝了socket

這裏要說明的是HttpClient分兩種

org.apache.commons.httpclient.HttpClient: 已再也不更新。已被Apache HttpComponents項目HttpClient和HttpCore取代。也就是新版HttpClient,org.apache.http.client.HttpClient

org.apache.http.client.HttpClient: 新版HttpClient 。建議使用此版本。

2.3 OkHttpClient(Square公司家的)

新一代的Http訪問客戶端。相比於其餘輪子,他提供了鏈接池,gziping,緩存等功能。這裏不詳細解釋,自行百度。推薦使用OkHttpClient做爲發送http請求的工具。

還有其餘框架,就不一一介紹了。

發送http請求高級用法

有了各類輪子,咱們就能夠發送http請求了。可是若是項目中,每一個開發人員使用不一樣的輪子發送http請求,這樣結果確定不是咱們想要的

因而乎。

對於這種創造型的需求,咱們一般都會使用一個工廠模式來簡化對象的實例化部分,下降系統中代碼耦合度,而且加強了系統的擴展性。

3.1 ClientHttpRequestFactory

創造http請求客戶端的工廠。只有一個createRequest方法。用於建立http請求客戶端。返回一個ClientHttpRequest表明請求客戶端。

  • SimpleClientHttpRequestFactory 針對java.net.URLConnection 的工廠
  • OkHttpClientHttpRequestFactory 針對OkHttpClient的工廠
  • HttpComponentsClientHttpRequestFactory 針對 HttpClient 的工廠

有了工廠模式,按說已經很高級。不,這還不夠。

3.2 AbstractClientHttpRequestFactoryWrapper

AbstractClientHttpRequestFactoryWrapper 是對ClientHttpRequestFactory的進一步包裝. 實現類:

  • BufferingClientHttpRequestFactory: 使工廠建立的ClientHttpRequest具備緩存能力。
  • InterceptingClientHttpRequestFactory: 使用建立的ClientHttpRequest 具備攔截器的能力。

是否是看上去很熟悉? 裝飾器模式。回想IO中的,裝飾器的運用。

InterceptingClientHttpRequestFactory 類中有一個interceptors 屬性用來存儲攔截器。InterceptingClientHttpRequestFactory 在建立ClientHttpRequest時,會將攔截器封裝到ClientHttpRequest中去。

private final List<ClientHttpRequestInterceptor> interceptors;
複製代碼

ClientHttpRequestInterceptor:用於對請求以前的攔截處理功能。相似Filter. 會在發送請求以前先執行攔截器。

BufferingClientHttpRequestFactory:createRequest方法返回一個 BufferingClientHttpRequestWrapperBufferingClientHttpRequestWrapper會將response 緩存起來,以達到緩存的目的。

總結:

第一層用法

  • socket 最根本,最基礎

第二層用法:輪子

  • JDK原生
  • 第三方框

第三層用法:設計模式

  • ClientHttpRequestFactory 工廠模式
  • AbstracClientHttpRequestFactoryWrapper帶有特殊功能的工廠模式
相關文章
相關標籤/搜索