如果您已拥有资源,为什么ETag会设置为必须要求?

gar*_*mac 7 rest etag http cache-control http-headers

为什么要将ETag设置为"必须要求级别"?

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

我正在开发一个项目,我将客户端发送HTTP请求到服务器,该服务器返回带有ETag的HTTP Cache-Control标头以缓存响应(在每个添加请求中,它与If-None-Match标头进行比较确定数据是否陈旧以及是否应该发出新请求).在我当前的项目中,ETags参数使用条件GET体系结构,其具有RFC 2119中规定的MUST需求级别.

必须这个词,或术语"必需"或"应该",意味着该定义是规范的绝对要求.我不明白使用MUST需求级别的条件GET的意图?根据我的理解,必须要求限制(正确吗?)提供给发出请求的客户端的资源,但是客户端(在本例中我)已经拥有来自第一个请求的资源.我可以继续获得相同的资源(或更新的更新资源),无论是否返回If-None-Match和ETag头字段.

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

所以基本上,如果我可以在有或没有资源的情况下获得资源,是不是要求这个必须要求不是必需的?我在这里错过了什么吗?

我的问题不是询问Etags,Cache-Control或If-None-Match标头的工作原理和方式.

在此先感谢,欢呼!

Jen*_*och 6

如果您已拥有资源,为什么ETag会设置为必须要求?

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

除了能够缓存和限制对服务器的请求数量

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


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

  1. 当您进行API调用时,响应头包含一个ETag,其值是API调用中返回的数据的哈希值.您存储此ETag值以用于下一个请求.
  2. 下次进行相同的API调用时,请包含If-None-Match请求标头,其中包含从第一步开始存储的ETag值.
    • 如果数据未更改,则响应状态代码将为304 – Not Modified,且不返回任何数据.
    • 如果自上次查询以来数据已更改,则通常会使用新的ETag返回数据.游戏再次启动:您存储新的ETag值并将其用于后续请求.

为什么?

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

这不仅仅用于限制资源吗?

没有...

  • 您可以在一个请求中向API请求多个资源.
    • (好吧,那也是通过保存其他请求来限制资源.)
  • 当客户端认为资源不存在时(取代保护),您可以阻止方法(例如PUT)修改现有资源.

我可以在有或没有它的情况下获得资源?

当您忽略"必须使用条件GET"时,(a)流量将增加,(b)您丢失来自服务器端的"资源已更改"指示.您必须在客户端实现比较处理:第二个请求的资源比第一个请求的资源更新.