【问题标题】:How can a HTTP client request the server for latest data/to refresh cache?HTTP 客户端如何向服务器请求最新数据/刷新缓存?
【发布时间】:2016-05-17 13:22:01
【问题描述】:

我们正在设计一个带有服务器端缓存的 REST 服务。我们想为客户提供一个选项,即使缓存的数据没有过期,也可以专门询问最新的数据。我正在研究 HTTP 1.1 规范,看看是否存在执行此操作的标准方法,Cache Revalidation and Reload Controls 似乎符合我的需要。

问题

  • 我们应该只使用Cache Revalidation and Reload Controls吗?
  • 如果不是,是否可以包含带有纪元时间的If-Modified-Since 标头,导致服务器始终认为资源已更改?规范并不排除这一点,但我想知道我是否在滥用 :) 标题的意图?
  • 识别要刷新的资源的好方法是什么?在我们的例子中,仅 URL 路径是不够的,我不确定查询或矩阵参数是否被视为唯一 URL 的一部分。使用ETag 怎么样?

【问题讨论】:

    标签: rest http caching cache-control


    【解决方案1】:

    如果您的客户想要一个全新的资源表示,它可以指定max-age=0 来执行此操作。这实际上是 intent 接收不超过 0 秒的响应。

    您提到的所有其他机制(If-Modified-Since、ETag、If-Match 等)都与缓存一起使用,以确保资源处于某种状态。仅当您确定自己拥有有效的资源状态时,它们才起作用。您可以将其视为乐观锁定。您可以针对资源何时更改或未更改提出条件请求。但是你必须知道你是否期待改变。

    您可能会误用您所说的If-Modified-Since,但max-age 可以更好地传达您的意图。

    另请注意,根据设计,沿途可能会有多个缓存,而不仅仅是您的服务器端缓存。大多数情况下,客户端也会缓存,并且可能还会有其他透明缓存。

    【讨论】:

    • Cache-Control: no-cache 怎么样?会计。根据规范和this thread,这似乎更合适,不是吗?
    • 当然取决于。有一个细微的差别,可能重要也可能不重要。使用no-cache,您说您根本不希望响应被缓存,下次必须再次重新验证。使用max-age=0 你只是说你现在想要一个当前的表示,但之后它可能会被正常缓存。从技术上讲,我应该说max-age=0, must-revalidate,即使以其他方式配置,它也会绑定到所有缓存。
    • 谢谢。您能否指出规范中说明这种差异的部分,以便我可以将其用作参考?
    • 当然,no-cache、max-age 和 must-revalidate 的描述在这里:tools.ietf.org/html/rfc7234#section-5.2.2
    • 在阅读 section-5.2.1.4 之后,似乎 no-cache request directive 最适合我的需要。引用 - ““no-cache”请求指令表明缓存不能使用存储的响应来满足请求,而无需在源服务器上成功验证。”关于后续请求什么也没说,这正是我想要的。 section-5.2.2.2中还有一个no-cache响应指令,和你说的一致,也适用于后续请求。
    【解决方案2】:

    根据section-5.2.1.4,看来 no-cache request directive 最适合我的需要。

    “no-cache”请求指令表明缓存不能使用 存储响应以满足请求而没有成功验证 在源服务器上。

    关于后续请求什么都没说,这正是我想要的。 section-5.2.2.2 中还有一个 no-cache 响应指令,但这也适用于后续请求。

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多