BridgeInterceptor 拦截器的功能主要有以下 3 点:
是负责将用户构建的一个 Request 请求转化为能够进行网络访问的请求。(添加头部信息)
将这个符合网络请求的 Request 进行网络请求。
是负责将用户构建的一个 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