创建与POST/PUT一起工作的REST API是很简单的。它们是不可重复的,因此默认情况下浏览器不会缓存它们。
但是在创建GET端点时,情况就变得更加棘手。我担心浏览器(或特定的浏览器)在可以缓存GET请求时会尝试缓存它们,这样我最终会得到过期的数据。
这种强制缓存的恐惧是真实存在的吗?
让我们以一个端点为例:GET /articles/123/comments
。
尽管这个端点是一个GET端点,但是每次请求都可以返回不同的内容,因为文章的评论被提交了。
- 这会被缓存吗?
- 它会被特定的浏览器缓存吗?
假设响应中没有任何与缓存相关的头信息。
content-length: 2518
content-type: application/json
date: Thu, 17 Oct 2019 07:51:59 GMT
status: 200
如何避免GET请求中过期数据的最佳实践?
解决这个问题似乎有不同的策略,但哪种方式是最好的呢?
通过唯一的查询字符串来破坏缓存来使我的GET调用没有过期的数据?
例如:
GET /articles/123/comments?nonce=12312310980923409
添加
Cache-Control:no-cache
(这样做是否总是被尊重?)添加
ETag:xyz_HASH_OF_MY_LIST_OF_COMMENTS
?添加
Cache-Control:max-age = 0
(禁用缓存)添加
Cache-Control:max-age = 60
(减少缓存的最大持续时间)不必担心并假设没有像
ETag,Last-Modified
这样的标头, GET请求不会被任何浏览器缓存?