6

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

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

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

4

2 回答 2

5

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

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

于 2011-11-02T07:41:02.097 回答
-2

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

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

14.44 变化

Vary 字段值指示一组请求头字段,当响应是新鲜的时,该字段完全确定是否允许缓存使用响应来回复后续请求而无需重新验证。对于不可缓存或陈旧的响应,Vary 字段值会向用户代理建议用于选择表示的标准。

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

于 2012-07-24T07:48:12.203 回答