我应该在我的REST API的GET端点中添加Cache-Control: no-cache吗?

8

创建与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请求不会被任何浏览器缓存?

1个回答

3
对于浏览器来说,无论是由JavaScript发送到REST API还是您在地址栏中输入URL,GET请求看起来都是相同的。
如果您不设置缓存标头,规范允许浏览器做任何它想做的事情。默认情况下,浏览器会缓存对GET请求的响应,并使用“最佳猜测”方法确定持续时间。您应该始终明确设置缓存以获得一致的行为。
有关更多详细信息,请参见:
- 没有发送过期标头,内容被缓存,需要多长时间才能使浏览器进行条件GET请求? - 如果未设置过期和/或无缓存标头,Google Chrome会缓存资源多长时间? - 文件通常在浏览器缓存中保留多长时间 如何避免陈旧的内容?
这没有简单的答案。它取决于你的资源变化频率。如果它从不改变,你可以将其缓存很长时间,例如博客文章。如果它有时会改变,你可以将其缓存较短时间,例如新闻 API。如果它“总是”在改变,你就不应该缓存它,例如社交媒体新闻动态、股票价格 API 等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接