HTTP缓存
在Http协议中,缓存的控制是通过首部的Cache-Control来控制,通过对Cache-Control进行设置,即可实现不同的缓存策略。
Cache-Control和其他的首部字段一样,使用key:value结构,同时value可有多个值, 值之间以,分隔(具体参考HTTP详解)。Cache-Control是一个通用首部字段,在Http请求报文中可使用,也可在应答报文中使用。
请求指令集(在请求报文中的取值):
- no-cache: 不要缓存数据,直接从源服务器获取数据;
- no-store: 不缓存请求或响应的任何内容;
- max-age: 表示可接受过期过久的缓存数据,同指定了参数的max-stale;
- max-stale: 表示接收过期的缓存,如后面未指定参数,则表示永远接收缓存数据。如max-stale: 3600, 表示可接受过期1小时内的数据;
- min-fresh: 表示指定时间内的缓存数据仍有效,与缓存是否过期无关。如min-fresh: 60, 表示60s内的缓存数据都有效,60s之后的缓存数据将无效。
- only-if-cache: 表示直接获取缓存数据,若没有数据返回,则返回504(Gateway Timeout)
应答指令集(在应答报文中的取值):
- public: 可向任一方提供缓存数据;
- private: 只向指定用户提供缓存数据;
- no-cache: 缓存前需确认其有效性;
- no-store: 不缓存请求或响应的任何内容;
max-age: 表示缓存的最大时间,在此时间范围内,访问该资源时,直接返回缓存数据。不需要对资源的有效性进行确认;
must-revalidate: 访问缓存数据时,需要先向源服务器确认缓存数据是否有效,如无法验证其有效性,则需返回504。需要注意的是:如果使用此值,则max-stale将无效。
更详细内容可参考:Http首部字段定义
了解了HTTP的理论知识,后面我们对OkHttp中的缓存进行简单的介绍。
OkHttp拦截器
OkHttp默认对Http缓存进行了支持,只要服务端返回的Response中含有缓存策略,OkHttp就会通过CacheInterceptor拦截器对其进行缓存。但是OkHttp默认情况下构造的HTTP请求中并没有加Cache-Control,即便服务器支持了,我们还是不能正常使用缓存数据。所以需要对OkHttp的缓存过程进行干预,使其满足我们的需求。
OkHttp的优雅之处就在于使用了责任链模式,将请求-应答过程中的每一步都通过一个拦截器来实现,并对此过程的头部和尾部