Http 我应该在ETag中包含媒体类型吗?

Http 我应该在ETag中包含媒体类型吗?,http,rest,http-headers,http-caching,Http,Rest,Http Headers,Http Caching,将ETag添加到HTTP响应时,是否应包括媒体类型?当然,我知道ETag是不透明的,但这里有一个例子: 假设我有一个客户端,它在application/json中请求一个人。我查找它并创建我的ETag,然后返回此人的JSON表示 现在,同一个客户机在同一个URI上对同一个人(尚未修改)发出另一个请求,但希望它位于application/xml中 显然,简单地返回304是不正确的,但我的问题是,在第二个请求中,我是否希望etag匹配,但没有基于Accept头(或content头)的缓存。此外,

将ETag添加到HTTP响应时,是否应包括媒体类型?当然,我知道ETag是不透明的,但这里有一个例子:

  • 假设我有一个客户端,它在application/json中请求一个人。我查找它并创建我的ETag,然后返回此人的JSON表示
  • 现在,同一个客户机在同一个URI上对同一个人(尚未修改)发出另一个请求,但希望它位于application/xml中

显然,简单地返回304是不正确的,但我的问题是,在第二个请求中,我是否希望etag匹配,但没有基于Accept头(或content头)的缓存。此外,缓存是否可能有来自同一URI的两个表示,或者每次切换内容类型时,您是否总是有一个无效的缓存?

不同的表示需要不同的实体标记


请参阅。

我相信您可以为不同的表示发送相同的Etag。只要您指定,它们应该作为两个不同的实体缓存在响应中。 如RFC 2616中所述,可以使用Vary字段完成此操作

14.44更改

Vary字段值表示请求头字段的集合 在响应为新响应时,完全确定缓存是否为空 允许使用响应来答复后续请求 没有重新验证。对于不可缓存或过时的响应,其 字段值向用户代理建议所使用的条件 以选择表示形式


使用
Vary:Accept
应该是合适的。

感谢您的澄清。我必须说我很惊讶。我想这就是为什么它被称为“实体”标签而不是资源标签的原因。请不要引用RFC 2616,因为相关的工作组已经承认它不够清楚,并且已经在回复中发布了一个指向澄清的指针。我觉得这有点不公平。当我开始理解对这个问题的回答时,我描述了糟糕的服务器实现如何造成缓存问题,而不是规范本身的缺陷。我认为你的判断与其他人认为恰当使用标题的判断相悖。克莱尔:如果你认为新的HTTP规范是错误的,那么我鼓励你到HTTPbis工作组邮件列表来讨论这个问题。文件已经接近最后一次通话了,所以现在是时候了。顺便说一句:我同意你需要使用Vary;我不同意的是,这已经足够了;因此,你链接到的另一个答案是不相关的(因为那里甚至没有提到ETag)。我很确定我没有争辩说新的HTTP规范是错误的,但是我很想在这个问题上有一些意见。可惜我没有。但我的立场是正确的,我提出的链接根本不涉及ETAG。我将不得不做一些进一步的研究,了解ETag是如何解释的,以及为什么Vary还不够。如果你有一些关于这个主题的链接,我将不胜感激。您描述的是“弱验证器”:“同样,如果验证器同时由给定资源的两个或多个表示共享,则该验证器是弱的,除非这些表示具有相同的表示数据。”