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

时间:2011-11-01 22:23:06

标签: http rest http-headers http-caching

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

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

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

2 个答案:

答案 0 :(得分:5)

不同的表示需要不同的实体标签。

请参阅http://trac.tools.ietf.org/wg/httpbis/trac/ticket/39

答案 1 :(得分:-1)

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

中所述

http://www.ietf.org/rfc/rfc2616.txt

  

14.44变化

     

Vary字段值表示请求标头字段的集合      完全确定响应是否新鲜,是否是缓存      允许使用响应来回复后续请求      没有重新验证。对于无法缓解或陈旧的回应,Vary      字段值向用户代理建议所使用的标准      选择表示。

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