如果您已经拥有资源,为什么将 ETag 设置为 MUST 要求?

Why would ETags set to a MUST requirement if you already have the resource?

为什么要将 ETag 设置为 "MUST requirement level"?

您在 ETag 返回之前获取资源...

我正在做一个项目,我作为客户端向服务器发送 HTTP 请求,该服务器 returns 带有 ETag 的 HTTP Cache-Control header 缓存响应(其中每个添加请求都会与 If-None-Match header 进行比较,以确定数据是否过时以及是否应发出新请求)。在我当前的项目中,ETags 参数使用具有 RFC 2119 中指定的 MUST 要求级别的条件 GET 架构。

MUST 这个词,或术语 "REQUIRED" 或 "SHALL",表示该定义是规范的绝对要求。 我不明白使用具有 MUST 要求级别的条件 GET 的意图?根据我的理解,MUST 要求是为了限制(对吗?)提供给发出请求的客户端的资源,但是客户端(在本例中为我)已经拥有第一个请求的资源。在有或没有返回 If-None-Match 和 ETag header 字段的情况下,我可以根据需要继续获取相同的资源(或更新的资源,如果它得到更新)。

在这种情况下,如果不限制返回的资源,将其设置为 MUST 要求级别的目的是什么,除了能够缓存和限制对服务器的请求量(我向客户端询问观点,是的,我知道我可以缓存它,但为什么必须要求)?这不就是用来限制资源的吗?

所以基本上,如果我可以使用或不使用它来获取资源,它不是使这个 MUST 要求不是一个要求吗?我在这里遗漏了什么吗?

我的问题不是询问 Etag、Cache-Control 或 If-None-Match header 的工作原理。

提前致谢,干杯!

我发现我的问题不是问 "right question",因为我合并了我对其他 header 的理解(感谢@dcerecedo 的评论让我指出了正确的方向)影响了我对为什么使用 MUST 的理解。

MUST 对其他 header 来说更重要,在我的情况下 privatemax-age=3600must-revalidate

在哪里

  1. Cache-Control: private 限制代理服务器缓存它,这有助于您将数据远离您不信任的服务器并防止代理从缓存与每个人都不相关的用户特定数据(如用户配置文件)。

  2. Cache-Control "max-age=3600, must-revalidate" 告诉客户端缓存和代理缓存一旦内容过时(超过 3600 秒)他们必须在原始服务器上重新验证才能提供内容。这应该是缓存系统的默认行为,但是 must-revalidate 指令使这个要求变得明确。

在 max-age 过期后,客户端应重新验证。它可能会使用带有 ETag 的 If-Match 或 If-None-Match headers 重新生效,或者它可能会使用带有 ETag 的 If-Modified-Since 或 If-Unmodified-Since headers日期。因此,过期后,浏览器将在服务器上检查文件是否已更新。否则,服务器将以 304 Not Modified header 响应,并且不会下载任何内容。

Why would ETags set to a MUST requirement if you already have the resource?

客户端必须使用条件 GET 来减少数据流量。

Aside from being able to cache and limiting the amount of requests to the server

请求数保持不变,但传输的数据总数发生变化。


在 if-none-matched GET 请求中使用 ETags(条件 GET)

  1. 当您进行 API 调用时,响应 header 包含一个 ETag,其值是 API 调用中返回的数据的哈希值。您存储此 ETag 值以在下一个请求中使用。
  2. 下次您进行相同的 API 调用时,您将 If-None-Match 请求 header 包含在第一步中存储的 ETag 值。
    • 如果数据没有改变,响应状态代码将是304 – Not Modified并且没有数据返回。
    • 如果自上次查询以来数据已更改,则数据将像往常一样返回,并带有新的 ETag。游戏再次开始:您存储新的 ETag 值并将其用于后续请求。

为什么?

  • 使用条件 GET 请求的主要原因是为了减少数据流量。

Isn't this only used for limiting resources?

没有...

  • 您可以在一次请求中请求 API 多个资源。
    • (好的,这也通过保存其他请求来限制资源。)
  • 当客户端认为资源不存在时,您可以阻止方法(例如 PUT)修改现有资源(替换保护)。

I can obtain the resources with or without it?

当您忽略 "MUST use conditional GET" 时,(a) 流量会增加,并且 (b) 您会丢失来自 server-side 的 "resource has changed" 指示。您必须在客户端实现比较处理:第二个请求的资源是否比第一个请求的资源新。