拦截器流程:
简单回顾同步 / 异步:
同步请求就是执行请求的操作是阻塞式,直到HTTP响应返回。
异步请求就类似于非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者。
okHttp拦截器:
来自官网的解释:拦截器是OkHttp中提供一种强大的机制,它可以实现网络监听、请求以及响应重写、请求失败重试等功能。
下面来看一下官网的一张介绍拦截器的图:
其中Okhttp包含Application Interceptors【应用拦截器】、系统拦截器、Network Interceptors【网络拦截器】,其中咱们接下来要分析的就是从系统自带的拦截器开始,那系统拦截器都有哪些呢,如下图:
关于这些系统拦截器在接下来会一一进行详细分析的,目前先有个大致的印象。
拦截器链介绍:
有了上面的理论了解之后,下面则从源码的角度来对拦截器进行一个进一步了解,这里以同步请求为例,因为异步请求关于拦截器这块基本上一样:
进一步定位:
那接下来将注意力集中在RealInterceptorChain.proceed()方法中:
然后此时在这个方法中有个核心代码:
这样就将若干个拦截器以链式的方式进行执行,这也是拦截器链的主要作用。下面总结一下拦截器:
1、创建一系列的拦截器,并将其放入到一个拦截器list中。
2、创建一个拦截器链RealInterceptorChain,并执行拦截器链的proceed方法。
那目前对于拦截器怎么链起来的有了一个大局观,那到底每个拦截器是怎么来衔接的呢?这里以一个具体的拦载器为例初步进行分析:RetryAndFollowUpInterceptor:
所以将目光集中在这个方法之上,代码比较多,这里先只看核心的:
而如之前所分析,我们知道RealInterceptorChain在proceed()方法中又会去获取下一个拦截器继续往下链,如下:
如此循环,就会将所有的拦截器依顺序一个个去执行完成,这也就是拦截器的一个核心实现逻辑。所以下面对拦截器的具体逻辑再总结一下:
1、在发起请求前对request进行处理。
2、调用下一个拦截器,获取response。
3、对response进行处理,返回给上一个拦截器。