简单的回顾下同步/异步
- 同步请求就是执行请求的操作是阻塞式,直到 Http 响应返回
- 异步请求就类似非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者
什么是拦截器呢?官网给了一个说明:
- 拦截器是OkHttp中提供的一种强大机制,它可以实现 网络监听,请求以及响应重写,请求失败重试 等功。
这里需要注意它这拦截器是不区分同步还是异步的,不管是同步/异步请求都会用到拦截器的功能来进行网络响应的获取。
OkHttp 框架内部给我们提供了那些拦截器呢?
- RetryAndFollowUpInterceptor 重试和失败重定向拦截器(主要是初始化的一些工作,创建StreamAllocation对象,用来传递给后面的拦截器)
- BridgeInterceptor 桥接和适配拦截器(主要是补充用户创建请求当中缺少的一些必要的请求头)
- CacheInterceptor 缓存拦截器(主要处理缓存功能)
- ConnectInterceptor 连接拦截器(主要负责建立可用的链接)——OkHttp核心拦截器,网络交互的关键
- CallServerInterceptor 网络服务拦截器(主要负责将请求写入到 IO 流当中,并且从 IO 流当中获取服务端返回给客服端的响应数据)——OkHttp核心拦截器,网络交互的关键
那拦截器链又是什么呢?
- 当发送一个请求的时候,实质OkHttp会通过一个拦截器的链来执行OkHttp的请求。
- 这就是所谓的拦截器链,执行 RetryAndFollowUpInterceptor => 执行 BridgeInterceptor => 执行 CacheInterceptor => 执行 ConnectInterceptor => 执行 CallServerInterceptor => 响应到
ConnectInterceptor => 响应到 CacheInterceptor => 响应到 BridgeInterceptor => 响应到 RetryAndFollowUpInterceptor
我们可以到源码中查看
我们可以知道不管同步/异步请求都调用了同一个方法,我们接着去这个 getResponseWithInterceptorChain() 方法看看里面做了什么。
其实 getResponseWithInterceptorChain() 方法所做的就是构成了一个拦截的链,然后通过依次执行每一个不同功能的拦截器来获取服务器的响应返回。我们再来看看这方法 他是怎么构成的链?
总结
1创建了一系列的拦截器,并将其放入到一个拦截器的List集合中
2 创建一个拦截器链 ReallnterceptorChain,并执行拦截器链的 proceed() 方法执行请求。
我们知道了拦截器的链的创建后还得调用拦截器链的 proceed() 方法来执行请求。我们又得到 proceed() 方法中去查看。
由于 Interceptor 是个接口,得到它的实现类 RealInterceptorChain 去查看
我们直接去看它的一个核心几处代码
我们具体到一个拦截器RetryAndFollowUpInterceptor中看看加深下理解
就直接到RetryAndFollowUpInterceptor的intercept方法中去查看。
总结
1 发起请求前对 request 进行处理(头部,响应,网络等等)
2 调用下一个拦截器,获取 response (为什么要调用下一个拦截器呢?——因为是有拦截器链的概念,只有调用下一个拦截器,才能构成这么一个链条)
3 对 response 进行处理,并返回给上一个拦截器
这就是 OkHttp 拦截器的一个核心逻辑了。