1.介绍
我是 Square 亲手打造的一款高效的HTTP客户端。首先,我先介绍一下自己的优点吧
-
我支持SPDY协议,所以我自带它们带来的低延迟效果哦。
SPDY是 Google 开发的,它在TCP/IP四层模型中处于应用层,目的是解决HTTP加载慢的问题。HTTP存在哪些问题,导致它加载慢那?
- HTTP1.0每一次请求都会新建一个TCP连接(短连接),HTTP1.1默认支持长连接,即一个TCP连接可以执行最多6个请求。
- 请求/响应报文是文本形式的明文,不安全
- 报文头部的信息大部分都是重复的,而且没有经过压缩。冗余性高,延迟大,加载页面缓慢
- 请求只能从客户端发起,且客户端只能接收服务器发来的响应指令
SPDY对于上面提到的这些问题进行了解决,主要特性是:
- SPDY支持单连接多路复用。即在同一个域名下,只使用一个TCP连接来执行所有请求。
- 通信内容使用二进制格式,而不是文本形式的明文。
- 头部使用二进制为表示HTTP中的头部,且使用压缩算法对headers进行压缩
- 支持全双工,即服务端可以主动与客户端进行通信
- 每一个流都可以设置优先级,服务端可以根据优先级优先处理流
- 强制使用 SSL和TLS验证
我可以选择最好的路线,并支持自动重连
我维护了 socket 连接池,用于减少握手次数,减少请求延时
网络中的并发问题是不是很头疼,放心,我是多线程安全的
我使用责任链模式实现的拦截器,对请求和响应过程可以进行监控,你可以选择不当透明人了哦
我有基于HEADERS的缓存响应策略,用来减少重复的网络请求
下面看一下我的结构图吧:
主要工作:通过Diapatcher不断从RequestQueue中取出请求(call),根据是否已缓存调用Cache或者Network这两类数据获取接口之一,从内存缓存或者服务器取得请求的数据,该引擎有同步和异步请求,同步请求通过Call.execute()直接返回当前Response,而异步请求会把当前的请求call.enqueue添加(AsyncCall)到请求队列中,并通过回调Callback的方式来获取最后结果。
2.请求流程
3.拦截器
观察,修改以及可能短路的请求输出和响应请求的回来,通常情况下拦截器用来添加,移除或者转换请求或者回应的头部信息。
4.缓存
1. 服务器支持缓存
如果服务器支持缓存,请求返回的Response会带有这样的header:cache-control,max-age=xxx,这种情况下我妈们只需要手动给OKHttp设置缓存就可以让OKHttp自动缓存,这个max-age的值代表了缓存在你本地存放的时间,可以根据实际需要来设置其大小。
首先我们要提供了一个文件路径用来存放缓存,出于安全性的考虑,在Android中我妈们推荐使用Context.getCacheDir()作为缓存的存放路径,另外还需要额外指定缓存的大小就可以创建一个缓存。再创建了缓存之后还需要将其设置到OKHttpClient对象里面。
2. 服务器不支持缓存
如果服务器不支持缓存就可能没有指定这个头部,或者指定的值是no-store等,在没有缓存的情况下我还使用本地缓存的时候就需要使用Interceptor来重写Response的头部信息,从而让OKHttp支持缓存。接着讲该Intercepter作为一个NetworkInterceptor加入到OKHttpClient中。这样就可以在服务器不支持缓存的情况下使用缓存了。
总结
外部通过构造Request,初始化OKHttpClient,并由两者共同构造出Call,访问网络通过Call,Call支持两种模式:同步和异步,同步使用execute,该方法立即返回一个Response,该Response中包含结果,异步使用enqueue,也要传入Callback来接受请求结果,OKHttp还支持拦截器,拦截器分两种,请求前拦截和网络返回前拦截。OKHttp还支持host检查,证书检查等等。