1. 程式人生 > 程式設計 >傳送http請求(1):傳送http請求的幾種方式

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

推薦閱讀:

SpringCloud原始碼閱讀0-SpringCloud必備知識

SpringCloud原始碼閱讀1-EurekaServer原始碼的祕密

SpringCloud原始碼閱讀2-Eureka客戶端的祕密

SpringCloud原始碼閱讀3-Ribbon負載均衡(上)

傳送HTTP請求在我們開發中是一件非常普遍的事情。

傳送http請求的方式

最基礎

1.1 Socket(最基礎)

Socket(最基礎) 客戶端與伺服器的連線歸根結底都是socket連線,在Java中就是客戶端的Socket與伺服器端的ServerSocket進行連線.

自己使用原生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帶有特殊功能的工廠模式