OkHttp網絡攔截器,應用攔截器?OKHttp有哪些攔截器,分別起什麼作用

1.1. OkHttp的特點

是基於建造者模式(建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。)
鏈式調用,每一個方法的返回值類型都是當前類的對象
1.2. OkHttp的優點

支持HTTP2/SPDY(SPDY是Google開發的基於TCP的傳輸層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。)
Socket自動選擇最好路線,並支持自動重連,擁有自動維護的socket連接池,減少握手次數,減少了請求延遲
共享Socket,減少對服務器的請求次數。
擁有Interceptors輕鬆處理請求與響應(自動處理GZip壓縮)。
1.3. 五大攔截器
1.3.1. RetryAndFollowUpInterceptor (重定向攔截器)

客戶端向服務器發送一個請求,獲取對應的資源,服務器收到請求後,發現請求的這個資源實際放在另一個位置,於是服務器在返回的響應頭的Location字段中寫入那個請求資源的正確的URL,並設置reponse的狀態碼爲30x 。

RetryAndFollowUpInterceptor 的攔截操作中做了這麼幾件事:

1、創建一個 StreamAllocation。
2、調用下一個chain 。
3、判斷是否重定向。重定向會對request做一些修改,返回新的request,否則會返回null。
4、followUp == null 無重定向,釋放資源,直接返回response。
5、比較重定向前後的 host、port、scheme是否一致,一致的話複用,否則重新創建 StreamAllocation。
6、通過 while (true) ,重複步驟 2

1.3.2. BridgeInterceptor (橋接攔截器)
內置的攔截器中第二個是 BridgeInterceptor。Bridge,橋,什麼橋?連接用戶請求信息 和 HTTP 請求的橋樑。
BridgeInterceptor 負責把用戶構造的請求轉換爲發送到服務器的請求、把服務器返回的響應轉換爲用戶友好的響應。
我們說下僑界攔截器大概都做了什麼吧,請求前:
1、如果這個請求有請求體,就添加 Content-Type, Content-Length等。
2、如果這個請求沒有 Host,就通過 url 來獲取 Host 值添加到 Header中。
3、如果這個請求沒有接收的數據類型Accept-Encoding,且沒指定接收的數據範圍,就添加默認接受格式爲 gzip。
5、去 CookieJar 中根據 url 查詢 Cookie 添加到 Header。
6、如果當前沒有,就添加 User-Agent 信息。
發起請求後:
7、解析響應 Header 中的 Cookie
8、如果想要數據的格式是 gzip,就創建 GzipSource 進行解壓,同時移除 Content-Encoding 和 Content-Length

1.3.3. CacheInterceptor (緩存攔截器)
第三個攔截器是緩存處理攔截器 CacheInterceptor,它的重要性用一句話來描述:最快的請求就是不請求,直接用緩存。
1、根據Request和之前緩存的Response得到CacheStrategy
2、根據CacheStrategy決定是請求網絡還是直接返回緩存
3、如果 step 2中決定請求網絡,則在這一步將返回的網絡響應和本地緩存對比,對本地緩存進行改增刪操作

1.3.4. ConnectInterceptor (連接攔截器)
我們知道,TCP 協議需要需要建立連接才能進行通信,每次請求都建立連接會極大地影響通信效率。
OkHttp 的優點之一優化了連接的建立:內部維護了可以重複使用的 Socket 連接池,減少握手次數,加快請求響應。
1、連接 RealConnection 是對 Socket 的封裝。
2、OkHttp 的連接複用主要是通過 StreamAllocation 來實現的,每個連接上持有一個。
3、StreamAllocation 引用的列表,以此來標識當前連接是否空閒。它裏面維護了List<Reference>的引用。List中StreamAllocation的數量也就是socket被引用的計數,如果計數爲0的話,說明此連接沒有被使用就是空閒的,需要通過下文的算法實現回收;如果計數不爲0,則表示上層代碼仍然引用,就不需要關閉連接。
4、判斷連接是否可以重用,除了比較連接當前的 host,也可以比較路由信息。
5、連接池在添加新連接時會運行清理任務,默認最多空閒連接爲 5,最長空閒時間爲 5 分鐘。

1.3.5. CallServerInterceptor(讀寫攔截器)
最後一個攔截器,CallServerInterceptor,它負責實現網絡 IO,所有攔截器都要依賴它才能拿到響應數據。
1、CallServerInterceptor 首先會將請求中的 header 寫給服務器。
2、如果有請求體的話,會再將 body 發送給服務器。
3、最後通過httpCodec.finishRequest() 結束 http 請求的發送。
4、然後從連接中讀取服務器的響應,並構造 Response。
5、如果請求的 header或服務器響應的 header 中,Connection 的值爲 close,就關閉連接。
6、最後返回 Response。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章