一、缓存的流程
- 读取缓存
- 创建缓存策略
- 根据策略,在不使用网络的情况下
- 没有缓存,返回504报错 HttpGatewayTimeout
- 有缓存,直接返回结果
- 执行下一个Interceptor,即ConnectInterceptor
- 接收响应
- code为304,即HttpNotModified ,说明没有变化,有缓存则返回
- 对数据进行缓存
二、使用
1. 客户端的配置
默认情况下,okhttp是不开启缓存的
需要配置,提供Cache的写入位置和最大的缓存数量
fun provideCache():Cache{
val cacheSize:Long = 10 * 1024*1024
val file = File(DRouter.getContext().cacheDir,"okhttp")
return Cache(file,cacheSize)
}
2. 服务端的配置
需要在请求头中提供
- Expires 该资源的过期时间
- Cache-Control 缓存控制
- private 表示数据内容只能被存储到私有的cache,仅对某个用户有效,不能共享
- public 表示数据内容可以被存储起来,就连密码?;さ耐骋泊娲?,安全性很低
- no-cache 表示可以缓存
- no-store 表示请求和响应禁止缓存
- max-age 返回数据的过期时间
三、正常的Http通信流程,缓存部分
- 第一次请求,返回200,缓存,并保留以下信息
- 最后修改的时间 Last-Modified
- 资源唯一标识 Etag
- 资源在客户端缓存的过期时间 Expires
- 第二次请求,如果有缓存
- 判断Expires没有过期,则直接返回缓存结果
- 过期了,则带上上次修改的时间再请求
- If-Modified-Since 填的是 Last-Modified
- If-None-Match 填的是 Etag
- 服务端返回结果
- 资源没有变化,则返回304,可继续用缓存
- 变化了,则返回新的结果
四、其他设置
- 强制使用网络
cacheControl(CacheControl.FORCE_NETWORK)
- 强制使用缓存,则在没有缓存时会直接报错504
cacheControl(CacheControl.FORCE_CACHE)