https://zhuanlan.zhihu.com/p/145940502
okhttp
Okhttp设计之初就是一个java平台通用的网络库,对于不同的java版本,还有安卓的底层适配逻辑是不同的。简单的说Okhttp就是抽象了下所有Tls,SSLSocket相关的代码,然后通过一个Platform,根据当前使用环境的不同,去反射调用不同的实现类,然后这个抽象的类去调用Platform的实现类代码,做到多平台的兼容。
其中Tls当生成好SSLSocket之后,就会开始进行client say hello 和server say hello的操作了,这部分完全和https定义的一模一样。Handshake则会把服务端支持的Tls版本,加密方式等都带回来,然后会把这个没有验证过的HandShake用X509Certificate去验证证书的有效性。然后会通过Platform去从SSLSocket去获取ALPN的协议支持信息,当后端支持的协议内包含Http2.0时,则就会把请求升级到Http2.0阶段。
OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
拦截器之间按照责任链模式顺序调用。
责任链模式:https://blog.csdn.net/qq_33768280/article/details/81384894
OkHttp优点
(1)支持HTTP2/SPDY
(2)拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数
(3)基于Headers的缓存策略减少重复的网络请求
(4)拦截器Interceptors(AOP实现)
OkHttp功能
(1)一般的get请求、post请求
(2)基于Http的文件上传下载
(3)加载图片
(4)支持session的保持
(5)支持自签名网站https的访问,提供方法设置下证书就行
(6)支持取消某个请求
okhttp的五大拦截器
RetryAndFollowUpInterceptor
是重试拦截器,是失败时重新开始的拦截器
利用while循环不停尝试,最大重试次数为20
BridgeInterceptor
是桥接拦截器
进一步封装Reponse对象
CacheInterceptor
缓存拦截器
有效地通过缓存减少网络请求的次数
判断是否需要返回缓存(即一般来说无网络就返回缓存)
有网络的情况下,判断返回的Response是否有更新,无更新就直接返回缓存,有更新就返回新的内容,并存入缓存。
ConnectInterceptor
连接拦截器,建立与服务器的连接
okhttp的连接是维护在一个连接池中的,
获取连接的流程:
如果能通过地址取到连接就返回,否则下一步
更换线路继续尝试获取连接,取到就返回,否则下一步
创建新的连接,建立与服务端的TCP连接
将新的连接加入连接池
CallServerInterceptor
网络请求连接器,负责向服务端发送数据
主要利用httpStream的readResponseHeaders()方法获取response
EventBus
使用发布订阅的事件总线,使代码解耦,使用观察者模式调用订阅者。