首页 > 解决方案 > 基于日期和年龄标头缓存响应

问题描述

我们看到一些行为,我们没有在 OkHttp 中缓存响应,并且每次都访问服务器。然而,响应在未来有一个过期时间,所以理想情况下它会被缓存。

这是我们在响应中看到的标头的一个简单示例(请求已发送,响应已在 接收Sat, 16 Jan 2021 00:40:36 GMT):

date: Sat, 16 Jan 2021 00:40:36 GMT
age: 6
expires: Sat, 16 Jan 2021 00:40:40 GMT
last-modified: Sat, 16 Jan 2021 00:40:30 GMT

从我从 CacheStrategy 中看到的情况来看,问题在于它将日期 + 年龄相加,看看它是否超过了到期时间。在这种情况下,00:40:36 + 6 = 00:40:42 > 00:40:40, 所以它最终不会被添加到缓存中。

所以我认为理想情况下,要么响应日期等于 last-modified(在本例中为 2021 年 1 月 16 日星期六 00:40:30 GMT),要么我们需要一个自定义 CacheStrategy 来使用 last-modified 而不是这些计算的日期。

如果有人对我是否做出任何错误的假设有任何见解,或者上述选项之一是否更可取,请告诉我。我查看了日期/年龄标题的一些规范,我有点不清楚在这种情况下它们应该是什么。

我还发现调试 OkHttp 中的缓存行为有点困难,现在我一直在使用条件断点来尝试跟踪它,但如果有人有更好的想法,我也会很感激。

标签: androidhttp-headersokhttpcloudflarecache-control

解决方案


expires标头替换为设置 max-age 指令的 Cache-Control 标头:

Cache-Control: max-age=86400

这将导致 OkHttp 将响应缓存 24 小时,无论它何时提供。expires 标头有问题,因为 CloudFlare 将其视为特定的到期时间,而不是持续时间。


推荐阅读