(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

猜你喜欢

转载自blog.csdn.net/zhouy1989/article/details/80573578