2

我正在从 Google App Engine 服务器提供一些 JSON 内容。我需要为内容提供一个 ETAG,以了解自我上次加载数据以来它是否发生了变化。然后我的应用程序将删除它的旧数据并使用新的 JSON 数据来填充它的视图。

    self.response.headers['Content-Type'] = "application/json; charset=utf-8"
    self.response.out.write(json.dumps(to_dict(objects,"content")))

为响应设置 ETAG 的最佳做法是什么?我必须自己计算 ETAG 吗?或者它是一种让 HTTP 协议执行此操作的方法?

4

2 回答 2

4

您必须自己计算电子标签值。电子标签是不透明的字符串,只对应用程序有意义。

最佳实践是连接所有决定 JSON 内容的输入变量(转换为字符串);如果发生更改,将导致 JSON 输出发生更改的任何内容都应该是其中的一部分。如果这些字符串中有任何您不想暴露的敏感信息,请改用这些值的 MD5 哈希值。

例如,在我管理的一个 CMS 应用程序中,首页具有以下电子标签:

|531337735|en-us;en;q=0.5|0|Eli Visual Theme|1|943ed3c25e6d44497deb3fe274f98a96||

我们关心的输入变量已经与|符号连接成一个不透明的值,但它确实代表了几个不同的输入值,例如最后修改的时间戳(数字)、浏览器接受的语言标题、当前的视觉主题、以及从浏览器 cookie 中检索到的内部 UID(并确定首页上的内容取自哪个上下文)。如果这些变量中的任何一个发生变化,则页面可能会有所不同,并且缓存的副本将过时。

请注意,如果没有快速验证的方法,电子标签将毫无用处。客户端会将它包含在If-None-Match请求标头中,服务器应该能够快速从当前变量重新计算电子标签标头并查看标签是否仍然是最新的。如果重新计算所花费的时间与重新生成内容主体的时间相同,那么发送304 Not Modified响应而不是响应中的完整 JSON 主体只会节省一点带宽200 OK

于 2012-11-14T11:19:10.220 回答
4

如果您使用的是 webapp2,它可以根据响应正文自动添加一个 md5 ETag。

self.response.md5_etag()

http://webapp-improved.appspot.com/guide/response.html

于 2012-11-14T12:41:14.440 回答