1、概论
在上一篇文章里面,我们详细的剖析了HTTP协议的缓存机制。但那主要是从服务器端进行分析的,这有助于我们理解HTTP的缓存机制,并为我们用好OkHttp3这一客户端的封装库提供更为清晰的思路。知其原理,才能事半功倍。如果对于HTTP协议的缓存机制还不是很不清楚,可以去看下上一篇博客HTTP协议进阶之缓存
本篇文章主要从客户端的缓存控制出发,探讨如何利用OkHttp3是如何对缓存进行控制的。
2、请求报文的Cache-Control
在写代码之前,我们先通过下表大概回顾一下HTTP请求报文中与缓存相关的首部字段Cache-Control中的值都有哪些,它们的作用分别都是什么,它们的详细解释在上一篇博客HTTP协议进阶之缓存中:
指令 | 目的 |
---|---|
max-stale=s | 在s时间段内,文档不会过期。该指令放松了缓存的规则 |
min-fresh=s | 至少在未来的s秒内文档要保持新鲜。这使缓存规则更加严格了 |
max-age=s | 缓存无法返回缓存时间长于s秒的文档。这条指令会使规则更加严格,除非同时还发送了max-stale指令,在这种情况下,使用期可能会超过其过期时间。 |
no-cache | 除非资源进行了再验证,否则这个客户端不会接受已缓存的资源 |
no-store | 缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息 |
only-if-cached | 只有当缓存中有副本存在时,客户端才会获取一份副本 |
注:参见《HTTP权威指南》第194页,表中没有包括兼容性的Progma: no-cache
3、OkHttp3缓存简单使用
OkHttp3中关于缓存的类,我们使用的最多的是:Cache类和ControlCache类,其中前者用于指定缓存的地址和大小,后者用于对缓存进行各种控制,ControlCache又有其构建者类Builder。
先利用Cache类定义缓存地址和缓存最大尺寸:
long maxCacheSize = 100 * 1024 * 1024;
Cache cache = new Cache(
new File("E:/Soft_Develop/iMooc/NetworkFrameDesign/Test"),
maxCacheSize);
然后将其注入到OkHttpClient实例中:
OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();
接着,构建我们的请求报文Request,我们使用凤凰网首页的网址,因为凤凰网首页的服务器支持缓存:
Request request = new Request.Builder()
.url("http://www.ifeng.com")
.build();
为了验证缓存是有效的,我们进行两次拉取,分别使用Response类的networkResponse()方法和cacheResponse()方法来查看从网络或缓存中读取到的内容情况: