首页 > 解决方案 > Fetch:如何使用etags?

问题描述

我打算使用 Etags 来验证已编辑的项目以避免空中碰撞(如果该项目已被数据库中的其他进程或用户修改)。这是计划

问题:

这是一个好方法吗?

如何使用 fetch 将其很好地存储在项目对象中?更准确地说,如何以response.json()一种很好的方式将标头值(Etag)与返回的值结合起来?

谢谢!

标签: javascriptjsonheaderfetchetag

解决方案


  1. 这是一个好方法吗?

是的,这是预期用途/记录的方法。

  1. 如何使用 fetch 将其很好地存储在项目对象中?

这是有争议的,但是您可以将 etag 标头与您的数据一起包装并传递该对象。例如

    fetch('/data.json')
        .then(r => ({
            etag: r.headers.get('etag'), 
            json: r.json()
        }))
        .then(data => { 
            // do something with your etag and data
            console.log(data.etag);
            data.json.then(console.log)
        })
        .catch(console.error.bind(console));

避免空中冲突 借助 ETag 和 If-Match 标头,您可以检测空中编辑冲突。

例如,在编辑 wiki 时,当前的 wiki 内容可能会被散列并放入响应中的 Etag 标头中:

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" 当保存对 wiki 页面的更改(发布数据)时,POST 请求将包含 If-Match 标头,其中包含要检查新鲜度的 ETag 值。

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" 如果哈希值不匹配,则表示文档已在中间编辑,并抛出 412 Precondition Failed 错误。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag


推荐阅读