使用 OkHttp 基本是以下四步:
-
创建
OkHttpClient
对象 -
创建
Request
请求对象 -
创建
Call
对象 -
同步请求调用
call.execute();
异步请求调用
call.enqueue(callback)
OkHttp最主要的两个部分:
(1)分发器
(2)拦截器
因为我们的okhttp支持并发的请求,不是一次只帮你处理一个网络请求,它是支持并发的。
那么分发器它是帮助我们将我们提交给okhttp的各种请求去进行一个任务的分配。
那么提到并发,就想到了并发编程相关的知识点,想到了多线程,想到了线程池,
那么分发器它里面就配置了一个线程池。
我们的异步请求任务,都会在这个线程池里面去提交一个任务,除了分发器之外呢,还有就是我们的拦截器。
okhttp里面有五大默认的拦截器,采用责任链的设计模式。
除了五大默认的拦截器之外呢,我们也可以自己去加入我们自己的普通拦截器以及NetworkInterceptor,
这些拦截器符合了单一责任原则,每个拦截器只负责一项工作,负责自己的一项工作。
五大默认拦截器:
(1)RetryAndFollowUpInterceptor 重试和重定向拦截器
分发器分发任务后,我们提交给okhttp是一个Request,那么重试和重定向拦截器它会第一个接收到我们请求
的Request对象,然后分发重试与重定向拦截器它并不会对我们的Request进行太多的处理,它基本就是它直接把
我们的Request让下一个拦截器处理,它只要是对返回的Response做了一些处理,比如说我们的Response,
我们查看到服务器给我们的响应码是300、301、302这些需要重定向的,那么我们这个拦截器,它会自动的
帮我们去找到我们响应头当中有一个Location,Location后面跟的是一个新的链接,意味着我们需要跟这个新的链接去发请求.
(2)BridgeInterceptor 桥接拦截器
下一个拦截器就是桥接拦截器,桥接拦截器会帮我们往这个请求的请求头当中加入一些参数,如果熟悉HTTP请求的同学,
你可能会有了解我们的每一个HTTP请求,这里针对的是HTTP1.1,你都要在请求头当中加上一个Host请求,
Host请求头的value对应了你要请求的那一个请求的哪一个接口的域名,我们会发现我们在实际使用HTTP的时候,
我们并不会手动的给我们每一个请求去加上这一个Host,所以这个Host又是HTTP里面一定要加的,那怎么办呢?
这个Bridge它帮我们加了这个东西,除了这个Host请求头之外,还有像一些cache-Control缓存控制、一些gzip压缩,
包括cookie的设置都是在这个Bridge拦截器里面自动帮我们进行的。
(3)CacheInterceptor 缓存拦截器
下一个拦截器是缓存拦截器,缓存连接器里面它就会去判断我们是否有本地缓存,如果说对应的这个一个请求,
有本地缓存的话,就不会去请求服务器了,它直接从缓存当中把数据解析出来,然后响应给我们的请求值,响应给我们的用户。
所以这个缓存规则的话,其实是非常复杂的,它跟我们的请求头有关,跟我们的响应头也有关,
跟我们使用者它自己配置的使用okhttp缓存接口的配置,它都会影响我们的缓存的一个判定,所以还是要怎样所以还是要去了解HTTP协议的规则。
(4)ConnectInterceptor 连接拦截器
如果不允许使用缓存,就会把请求交给下一个拦截器,下一个拦截器就是ConnectInterceptor 连接拦截器,
它的作用就是帮我们获取到一个有效的健康的连接TCP连接,因为HTTP协议是基于TCP协议的,我们怎么来建立TCP连接呢,
Socket,在建立Socket连接的时候,因为这个Socket我们都知道是全双工的,它是一个长连接的,而我们的HTTP其实有可能,
你会发起一次请求之后就断开了,这个取决于我们使用的HTTP的版本,以及请求和响应头的一些控住,那个
keep-Alive请求头和响应头的一个控制,我们如果说达到了条件的情况下,一个Socket跟某一台服务器建立连接,
我们下一次再要来请求,这台服务器的其他接口,包括同样的接口的话,其实可以复用这个Socket,
所以在Connect拦截器里面呢,它要帮我们去找到这样的一个可以复用的socket,如果说没有找到可以复用的socket,
它就帮我们去建立Socket,OKhttp里面有很多的其他细节,比如路由机制,还可以配置代理,代理又分为Socket代理和HTTP代理,
HTTP代理又分为普通代理和隧道代理,所以这些东西都是网络基础的东西。拿到这个Socket就可以完成跟服务器的交互了。
(5)CallServerInterceptor 请求服务拦截器
下一个拦截器是请求服务拦截器,它拿到了经过一系列处理的Reques和一个Socket,那么它就可以去利用Socket的OutputStream
输出流,把我们的Request再按照它里面的配置的各种参数,组装成HTTP的报文,HTTP的报文在2.0以下的时候,其实就是一些
字符串,2.0以上就是一些二进制的格式,那我们就主要是基于这个它其实就是去进行字符串的拼接,把我们的Requst包含的各种信息
拼接成HTTP报文,然后用Socket发出去。就完成了我们整个的请求。然后通过Socket的InputStream得到服务器的响应。服务器响应我
们的呢,也是一段字符串,HTTP的报文字符串,然后按照HTTP的规则,去对这一段报文进行解析,解析到了之后,是在CallServerInterceptor
里面拿到了这个Response,然后再一层层的往上面去返回,返回到上一层的连接拦截器,再返回到缓存拦截器,直达第一个拦截器,
一层层的处理,我们也可以加入自己的拦截器,有2个接口,一个是addIntercept,一个是addNetworkIntercept,addIntercept拦截器
会在RetryAndFollowUpInterceptor前面,也就是会在我们的拦截器的最前面,而addNetworkIntercept呢,因为okhttp不仅仅只是支持
HTTP协议的,还支持WebSocket,如果我们是使用WebSocket的话,那么NetworkIntercept它没有意义,如果我们使用okHttp协议,
我们进行的是HTTP请求,那么我们配置的NetworkInterceptor它是有意义的,而NetworkInterceptor它是加在了我们CallServer的上一层,
这是OKHTTP的拦截器。