是負責將用戶構建的一個 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