Okhttp Interceptor 源码解析

image10.png

添加拦截器


image11.png

image12.png

这样添加到源码中的 OkHttpClient 类集合中。


image13.png

RealCall类中
下面以Call的同步方法execute()为例子
image14.png

在RealCall类中,进行拦截器的所有添加


image15.png

添加完之后,调用RealInterceptorChain类中的 proceed()方法进行拦截器处理
image16.png
image17.png

这个方法就是循环递归的重要方法,做拦截器处理,因为每次进入一个拦截器都会把RealInterceptorChain这个对象传递过去


image24.png

在回调给这个对象进行循环递归

这面举一个 HttpLoggingInterceptor 拦截器为例
假设他是集合里面的index为0的拦截器
Response response = interceptor.intercept(next);
当调用这个方法的时候,会去调用 HttpLoggingInterceptor里面的


image18.png

这面其实就是HttpLoggingInterceptor的
public Response intercept(Chain chain) 这个方法里面的代码
response = chain.proceed(request);
当调用这个的时候会在一次走到


image20.png

image19.png

这个RealInterceptorChain 类里面的这个方法里面进行 index+1
循环递归,

对于request的拦截器处理


image21.png

会把新的请求给下一个拦截器保持最新的请求.
就好比请求头,因为每add一个拦截器都会拿上一个拦截器的request,如果有拦截器处理请求则去处理request去改变request
所以说最终的request是最完美的request
最终把请求给到CallServerInterceptor
拦截器中,也就是循环递归


image22.png

CallServerInterceptor 里面的 Response intercept(Chain chain)
image23.png

通过request拿到请求的response
返回给每一个拦截器进行reponse处理。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容