OkHttp3.7源碼分析文章列表如下:
拆輪子:OkHttp 的源碼解析(一):概述
拆輪子:OkHttp 的源碼解析(二):流程分析
拆輪子:OkHttp 的源碼解析(三):任務分發(fā)器(Dispatcher)
拆輪子:OkHttp 的源碼解析(四):攔截器(Interceptor)
攔截器接口
public interface Interceptor {
Response intercept(Chain chain) throws IOException;
interface Chain {
Request request();
Response proceed(Request request) throws IOException;
Connection connection();
}
}
okhttp 默認的攔截器
默認的攔截器
- retryAndFollowUpInterceptor
- 在網絡請求失敗后進行重試
- 當服務器返回當前請求需要進行重定向時直接發(fā)起新的請求看成,并在條件允許情況下復用當前連接
- BridgeInterceptor
- 設置內容長度,內容編碼
- 設置gzip壓縮止状,并在接收到內容后進行解壓。省去了應用層處理數據解壓的麻煩
- 添加cookie
- 設置其他報頭当编,如User-Agent,Host,Keep-alive等喂急。其中Keep-Alive是實現多路復用的必要步驟
- CacheInterceptor
- 當網絡請求有符合要求的Cache時直接返回Cache
- 當服務器返回內容有改變時更新當前cache
- 如果當前cache失效,刪除
- ConnectInterceptor
- 負責和服務器建立連接
- CallServerInterceptor
- 負責向服務器發(fā)送請求數據吠式、從服務器讀取響應數據
getResponseWithInterceptorChain() 分析
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());
interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(
interceptors, null, null, null, 0, originalRequest);
return chain.proceed(originalRequest);
}
networkInterceptors : 配置 OkHttpClient 時設置的一個攔截器的 List茁彭。
這里主要做了如下幾件事:
- 創(chuàng)建一個攔截器集合 ArrayList总寒,向集合中添加一系列攔截器,包括用戶自定義的攔截器和框架內部攔截器尉间。
- 創(chuàng)建一個攔截器鏈 RealInterceptorChain偿乖,并執(zhí)行攔截器鏈的 proceed 方法。
責任鏈模式
下面設計到責任鏈模式哲嘲,如果你不知道什么是責任鏈模式,請點擊
多個攔截器配置構成一個攔截器鏈 Interceptor.Chain媳禁,環(huán)環(huán)相扣眠副,最終圓滿完成一次網絡請求。
借用一張圖來表示:
攔截器鏈.png
如果你還想看每個 Interceptor 的具體分析
或者想看攔截器鏈的proceed方法
請點擊下面博文:
OkHttp 3.7源碼分析(二)——攔截器&一個實際網絡請求的實現
友情提示:慎點竣稽,很容易看暈的囱怕,o(╯□╰)o