拦截器流程:

简单回顾同步 / 异步:

同步请求就是执行请求的操作是阻塞式,直到HTTP响应返回。

异步请求就类似于非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者。

okHttp拦截器:

来自官网的解释:拦截器是OkHttp中提供一种强大的机制,它可以实现网络监听、请求以及响应重写、请求失败重试等功能。

下面来看一下官网的一张介绍拦截器的图:

okhttp初识拦截器-LMLPHP

其中Okhttp包含Application Interceptors【应用拦截器】、系统拦截器、Network Interceptors【网络拦截器】,其中咱们接下来要分析的就是从系统自带的拦截器开始,那系统拦截器都有哪些呢,如下图:

okhttp初识拦截器-LMLPHP

关于这些系统拦截器在接下来会一一进行详细分析的,目前先有个大致的印象。

拦截器链介绍:

有了上面的理论了解之后,下面则从源码的角度来对拦截器进行一个进一步了解,这里以同步请求为例,因为异步请求关于拦截器这块基本上一样:

okhttp初识拦截器-LMLPHP

okhttp初识拦截器-LMLPHP

进一步定位:

okhttp初识拦截器-LMLPHP

okhttp初识拦截器-LMLPHP

okhttp初识拦截器-LMLPHP

那接下来将注意力集中在RealInterceptorChain.proceed()方法中:

okhttp初识拦截器-LMLPHP

然后此时在这个方法中有个核心代码:

okhttp初识拦截器-LMLPHP

这样就将若干个拦截器以链式的方式进行执行,这也是拦截器链的主要作用。下面总结一下拦截器:

1、创建一系列的拦截器,并将其放入到一个拦截器list中。

2、创建一个拦截器链RealInterceptorChain,并执行拦截器链的proceed方法。

那目前对于拦截器怎么链起来的有了一个大局观,那到底每个拦截器是怎么来衔接的呢?这里以一个具体的拦载器为例初步进行分析:RetryAndFollowUpInterceptor:

okhttp初识拦截器-LMLPHP

所以将目光集中在这个方法之上,代码比较多,这里先只看核心的:

okhttp初识拦截器-LMLPHP

而如之前所分析,我们知道RealInterceptorChain在proceed()方法中又会去获取下一个拦截器继续往下链,如下:

okhttp初识拦截器-LMLPHP

如此循环,就会将所有的拦截器依顺序一个个去执行完成,这也就是拦截器的一个核心实现逻辑。所以下面对拦截器的具体逻辑再总结一下:

1、在发起请求前对request进行处理。

2、调用下一个拦截器,获取response。

3、对response进行处理,返回给上一个拦截器。

05-27 09:00