返回

OkHttp3 拦截器详解 1:重试、重定向、桥接、缓存(精华)

Android

在 OkHttp3 全解系列的上一篇文章中,我们走读了一遍 OkHttp 的源码,初步了解了这个强大网络框架的基本执行流程。不过,上一篇文章只能说是比较粗略地阅读了 OkHttp 整个执行流程方面的源码,搞明白了 OkHttp 的基本工作原理,但并没有去深入分析细节(事实上也不可能在一篇文章中深入分析每一个细节)。

本篇文章,我们来深入分析一下 OkHttp 中的拦截器。

一、拦截器的作用

拦截器顾名思义,就是用来拦截的。拦截什么?——拦截网络请求。

更准确地说,拦截器是一个可以对网络请求进行 拦截处理 的组件。拦截器可以让你在网络请求的各个阶段(比如请求之前、请求之后、响应之前、响应之后)对网络请求进行处理。

二、拦截器的类型

OkHttp 中的拦截器分为两种类型:应用程序拦截器网络拦截器

  • 应用程序拦截器 :在应用程序层面进行拦截,可以对请求和响应进行处理。
  • 网络拦截器 :在网络层面进行拦截,可以对请求和响应进行处理,还可以对网络连接进行处理。

三、拦截器的使用

要使用拦截器,需要在 OkHttpClient.Builder 中添加拦截器。

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new MyInterceptor());

四、拦截器的编写

拦截器需要实现 Interceptor 接口。Interceptor 接口只有一个方法:

Response intercept(Chain chain) throws IOException;

intercept 方法需要返回一个 Response 对象。如果拦截器不进行处理,可以直接返回 chain.proceed(chain.request())。

五、拦截器示例

下面是一个简单的拦截器示例,该拦截器会在请求之前打印请求信息。

public class MyInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        System.out.println("请求信息:");
        System.out.println("请求方法:" + request.method());
        System.out.println("请求地址:" + request.url());
        System.out.println("请求头:" + request.headers());

        Response response = chain.proceed(request);

        System.out.println("响应信息:");
        System.out.println("响应码:" + response.code());
        System.out.println("响应消息:" + response.message());
        System.out.println("响应头:" + response.headers());

        return response;
    }
}

六、总结

拦截器是一个非常强大的组件,可以让你在网络请求的各个阶段对网络请求进行处理。拦截器可以用来做很多事情,比如:

  • 打印网络请求和响应信息
  • 缓存网络请求和响应
  • 重试网络请求
  • 重定向网络请求
  • 桥接网络请求

在后续的文章中,我们将详细介绍 OkHttp 中的拦截器的各种用法。