OkHttp源码分析:感受拦截器设计的艺术
前言
OkHttp简单易用,它又非常的流行。我们为什么不扒开她的外衣,看看她美妙的身材呢(小邪恶,嘿嘿)?看看人家的编码艺术,从而提高自己的技术水平。
在okhttp中拦截器(interceptor)扮演者重要的角色,我们今天就来happy的分析它。
数据的加工艺术
先举个小例子:方便面
我们经常吃方便面,可是你知道方便面是如何生产出来的吗?
由上图知:我们吃的方便面,由面粉经过一道道工序最终加工成了油炸方便面。
数据的加工
类比方便面的加工流程,在我们的编程中,我们时常会遇到这种情况:
在网络数据交换中,我们经常这样做:发送数据给服务器,接收服务器返回的数据。但是需要注意的是,我们发送和接收的数据也是经过多道工序加工过的。
- 发送的数据:原始数据-->添加头部信息-->打印数据的日志信息-->数据加密-->等等
- 接收的数据:原始数据-->数据解密-->数据流的观察(下载进度条)-->打印数据相关的日志-->等等
在okhttp中:
Request
这个类封装了你的请求数据
Response
这个类封装了服务器返回的数据
一般,我们先构造一个原始的Request
,交给Call
去发送这个请求,
这个请求经过多次加工,被送往服务器。然后服务器返回数据,返回的数据被层层加工,最终回到了我们的手里Response
。
以上说的流程用下图来简单的表示:
针对这个数据加工流程,okhttp是如何编码设计的呢?
拦截器 Interceptor
在一个拦截器中,你可以自由的加工Request和Response。
如下图:
拦截器
由上图可以看出每个拦截器是互相独立的,但是他们是如何链接到一起呢?
关于链接,okhttp就抽象了Chain这个接口。
链条 Chain
okhttp用链条chain来链接拦截器
如下图:
上面每个小圆圈代表一个chain,每个小圆圈环环相扣,形成一条长链子。
代码在这里
拦截器 和 链子的定义如下:
我们看一个链子的具体实现:
链子的核心:proceed
核心:Response proceed(Request request)
代码说明:
- 当前链子在
proceed
方法中,主动构造了下一个链子(将request流出)。 -
下一个链子被传入到下一个拦截器中,拦截器处理完毕(将response流入)。
chain连环相扣
我们看一个拦截器的实现:日志拦截器
拦截器的核心