傳送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方法返回一個 BufferingClientHttpRequestWrapper
。BufferingClientHttpRequestWrapper
會將response 快取起來,以達到快取的目的。
總結:
第一層用法:
- socket 最根本,最基礎
第二層用法:輪子
- JDK原生
- 第三方框
第三層用法:設計模式
- ClientHttpRequestFactory 工廠模式
- AbstracClientHttpRequestFactoryWrapper帶有特殊功能的工廠模式