改造:服务器返回ETag和Cache-Control:max-age = 60.如果请求<60s,是否应该使用缓存?

BoD*_*BoD 9 android http-caching retrofit2 okhttp3

我正在使用Retrofit,配置为使用带缓存的OkHttp.我称之为api:https://api.github.com/users/bod/repos,它返回一个Etag和一个Cache-Control: public, max-age=60, s-maxage=60标题.

我在不到60秒的时间内发出两个请求,所以我希望第二个请求根本不执行任何网络并根据Cache-Control指令使用缓存.但那不是我所看到的.

我猜这是因为该Etag指令优先?

这是正确/正常/预期的行为吗?

Ste*_* E. 3

RFC2068 超文本传输​​协议 - HTTP/1.1于 1997 年发布,详细介绍了ETagCache-Control标头。后来的文档RFC2616RFC7232都扩展了ETag标头以及它如何与If-None-Match.

RFC2616,13.3 验证模型包含您问题的答案:

当缓存有一个陈旧条目想要用作对客户端请求的响应时,它首先必须检查原始服务器(或者可能是具有新响应的中间缓存),以查看其缓存条目是否仍然可用。我们称之为“验证”缓存条目。

然后,它继续列出验证模型,包括实体标记 (ETag) 缓存验证器以及上次修改日期。过时的高速缓存条目是maxage该资源已发生该或其他到期机制的条目。

所以你的系统的行为是意想不到的。可能值得测试带有和不带有 ETag 标头的内容,以验证本地缓存是否正常工作。