(Android) OkHttp3.10 源碼學習筆記 7 BridgeInterceptor分析

BridgeInterceptor 攔截器的功能主要有以下 3 點:

是負責將用戶構建的一個 Request 請求轉化爲能夠進行網絡訪問的請求。(添加頭部信息)

將這個符合網絡請求的 Request 進行網絡請求。

將網絡請求回來的響應 Response 轉化爲用戶可用的 Response。

添加請求頭後,93行,又看到了我們熟悉的方法

Response networkResponse = chain.proceed(requestBuilder.build());

這裏會獲取response,並對response處理。這句話怎麼理解呢?例如 OKHTTP 默認就是支持 GZIP 壓縮的,若服務器返回的響應體是經過 GZIP 壓縮的,那麼 BridgeInterceptor 就有責任將其進行解壓,那麼調用者無需關係這個過程了,只要得到最終的 Response 即可。

往下看這個很長的判斷,當 transparentGzip 爲 true ,表示請求設置的 Accept-Encoding 是 支持gzip 壓縮的,意思就是告知服務器客戶端是支持 gzip 壓縮的,然後再判斷服務器的響應頭 Content-Encoding 是否也是 GZIP 壓縮的,意思就是響應體內容是否是經過 GZIP 壓縮的,如果都成立的條件下,那麼它會將 Resposonse.body().source() 的輸入流 BufferedSource 轉化爲 GzipSource 類型,這樣的目的就是讓調用者在使用 Response.body().string() 獲取響應內容時就是以解壓的方式進行讀取流數據。

    if (transparentGzip
        && "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))
        && HttpHeaders.hasBody(networkResponse)) {
      GzipSource responseBody = new GzipSource(networkResponse.body().source());
      Headers strippedHeaders = networkResponse.headers().newBuilder()
          .removeAll("Content-Encoding")
          .removeAll("Content-Length")
          .build();
      responseBuilder.headers(strippedHeaders);
      String contentType = networkResponse.header("Content-Type");
      responseBuilder.body(new RealResponseBody(contentType, -1L, Okio.buffer(responseBody)));
    }

總結一下BridgeInterceptor 

1、負責將用戶構建的一個Request請求轉化成能夠進行網絡訪問的請求

2、將這個符合網絡請求的Request進行網絡請求

3、將網絡請求返回的response轉化爲用戶可用的response

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