概念
- OkHttp 是 Square 公司开源的专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能等
- 优缺点
- 缺点:比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理
- 基本用法
- 创建OkHttpClient,可以用Builder模式
- 创建Request,用Builder模式创建
-
client.newCall(request)
返回Call- 同步请求execute,直接返回
- 异步请求enquue,callBack返回(onResponse、onFailure)
整体架构(可以从以下几个每个点深入切入)
- 接口:Call、OkHttpClient、Dispatcher、
- 流程:各个拦截器职责
- 协议:HTTP1.0、1.1、2.0(扩展gRPC),HTTPS(SSL、TLS),WebSocket
- 缓存:HTTP头缓存、DisLruCache、cookie
- 连接:StreamAllocation(连接、流、请求)、ConnectionPoll(模式、优化)
- IO:io、nio、okio(httpCodec)
Dispatcher线程池介绍
- 每个call只能被执行一次,复用则需要call#clone
- 采用Deque作为缓存,先进先出的顺序执行
- 任务在try/finally中调用了finished函数,控制任务队列的执行顺序,异步执行则执行下一个请求
拦截器职责(核心重点)
-
getResponseWithInterceptorChain
责任链模式解耦并执行每一层的功能操作,每一层创建对应的对象,需要添加则可以自定义Interceptor,Interceptor负责拦截和分发,主要是对请求和相应的过滤处理 -
RetryAndFollowUpInterceptor
- 负责失败重连以及重定向,失败根据Exception(协议错误、中断错误)的类型判断是否可以恢复,重定向根据响应码(code)(304)和响应头(header),查看是否需要重定向
-
BridgeInterceptor
- 负责对Request和Response报文进行加工,请求从我们应用层传入的数据参数类型转化为网络层的规定的数据类型,将网络层返回的数据类型 转化为 应用层数据类型,并对Htpp报文补充完整(Content-Type、Keep-Alive),加载并保存Cookie
-
CacheInterceptor
- 将请求和返回 关联的保存到缓存中,CacheStrategy类缓存到本地使用DiskLruCache进行缓存
- Http缓存策略:
- 判断是否过期,过期则下一步
- 有ETag标签,If-None-Match向服务器请求,服务器决策返回,更新200,无更新304
- 有Last-Modified标签,If-Modified-Since向服务器请求,服务器决策返回,更新200,无更新304
- 没有向服务器请求
-
ConnectInterceptor
- 真行的开始向服务器发起器连接,通过streamAllocation的
newStream()
获取一个流(HttpCodec,根据HTTP版本创建),HttpStream是Request和Response读写Socket的抽象 - newStream会根据ConnectionPoll查找是否有可复用的链接(当某个连接计数的次数小于限制的大小以及request的地址和缓存列表中此连接的地址完全匹配),最后创建Socket去连接
- 真行的开始向服务器发起器连接,通过streamAllocation的
-
CallServerInterceptor
- 最后连接成功会写入请求头,写入请求体,读取响应头,读取响应体,HttpCodec(解码器)来处理
- 从Socket写入读取都是基于更高性能的okio(扩展)
- 可以扩展自定义的拦截器
- 开启请求log、增加自定义head
扩展(源码修改)
- POST 缓存本地
- CookieJar修改