拆輪子:OkHttp 的源碼解析(四):攔截器(Interceptor)

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 默認的攔截器

默認的攔截器
  1. retryAndFollowUpInterceptor
  • 在網絡請求失敗后進行重試
  • 當服務器返回當前請求需要進行重定向時直接發(fā)起新的請求看成,并在條件允許情況下復用當前連接
  1. BridgeInterceptor
  • 設置內容長度,內容編碼
  • 設置gzip壓縮止状,并在接收到內容后進行解壓。省去了應用層處理數據解壓的麻煩
  • 添加cookie
  • 設置其他報頭当编,如User-Agent,Host,Keep-alive等喂急。其中Keep-Alive是實現多路復用的必要步驟
  1. CacheInterceptor
  • 當網絡請求有符合要求的Cache時直接返回Cache
  • 當服務器返回內容有改變時更新當前cache
  • 如果當前cache失效,刪除
  1. ConnectInterceptor
  • 負責和服務器建立連接
  1. 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 方法。

責任鏈模式

下面設計到責任鏈模式哲嘲,如果你不知道什么是責任鏈模式,請點擊

Android設計模式源碼解析之責任鏈模式

多個攔截器配置構成一個攔截器鏈 Interceptor.Chain媳禁,環(huán)環(huán)相扣眠副,最終圓滿完成一次網絡請求。

借用一張圖來表示:

攔截器鏈.png

如果你還想看每個 Interceptor 的具體分析
或者想看攔截器鏈的proceed方法
請點擊下面博文:
OkHttp 3.7源碼分析(二)——攔截器&一個實際網絡請求的實現
友情提示:慎點竣稽,很容易看暈的囱怕,o(╯□╰)o

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市毫别,隨后出現的幾起案子娃弓,更是在濱河造成了極大的恐慌,老刑警劉巖岛宦,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台丛,死亡現場離奇詭異,居然都是意外死亡砾肺,警方通過查閱死者的電腦和手機挽霉,發(fā)現死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來变汪,“玉大人侠坎,你說我怎么就攤上這事∪苟埽” “怎么了实胸?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵他嫡,是天一觀的道長。 經常有香客問我庐完,道長钢属,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任假褪,我火速辦了婚禮署咽,結果婚禮上,老公的妹妹穿的比我還像新娘生音。我一直安慰自己宁否,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布缀遍。 她就那樣靜靜地躺著慕匠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪域醇。 梳的紋絲不亂的頭發(fā)上台谊,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音譬挚,去河邊找鬼锅铅。 笑死,一個胖子當著我的面吹牛减宣,可吹牛的內容都是我干的盐须。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漆腌,長吁一口氣:“原來是場噩夢啊……” “哼贼邓!你這毒婦竟也來了?” 一聲冷哼從身側響起闷尿,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塑径,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后填具,有當地人在樹林里發(fā)現了一具尸體统舀,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年灌旧,在試婚紗的時候發(fā)現自己被綠了绑咱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡枢泰,死狀恐怖描融,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情衡蚂,我是刑警寧澤窿克,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布骏庸,位于F島的核電站,受9級特大地震影響年叮,放射性物質發(fā)生泄漏具被。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一只损、第九天 我趴在偏房一處隱蔽的房頂上張望一姿。 院中可真熱鬧,春花似錦跃惫、人聲如沸叮叹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛉顽。三九已至,卻和暖如春先较,著一層夾襖步出監(jiān)牢的瞬間携冤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工闲勺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曾棕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓菜循,卻偏偏與公主長得像睁蕾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子债朵,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容