javascript - Fetch:如何使用etags?
问题描述
我打算使用 Etags 来验证已编辑的项目以避免空中碰撞(如果该项目已被数据库中的其他进程或用户修改)。这是计划:
- 客户端调用 RESTful API,从 header 中获取一个 Etag,将其存储在 item 对象中。
- 当用户想要对项目进行更改时,Etag 将作为 If-Match 标头发送到 RESTful API,API 会根据当前记录对其进行验证,如果有效则保存,如果无效则使用代码 412 拒绝它
- 如果被拒绝,客户端会显示错误并告诉用户刷新页面
问题:
这是一个好方法吗?
如何使用 fetch 将其很好地存储在项目对象中?更准确地说,如何以response.json()
一种很好的方式将标头值(Etag)与返回的值结合起来?
谢谢!
解决方案
- 这是一个好方法吗?
是的,这是预期用途/记录的方法。
- 如何使用 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
推荐阅读
- django - 名称 'LoginRequiredMixin' 未在 django 中定义
- javascript - Javascript 块路径有冒号 https://example.com/js/chunk-vendors.b3792e11.js:18:16400
- javascript - 不按鼠标或 Javascript 中的任何键就无法播放音频
- node.js - React-admin:无法从 Nodejs 导入 Json 数据
- python - 字典效率列表
- flutter - Flutter 切换阴影效果
- flutter - 在 Flutter 中,如何检查是鼠标设备还是触摸设备?
- c# - 使用 IP 地址时限制对站点的访问
- android - 在 ARCore 使用相机时从服务中拍照
- android - Gradle build daemon 意外消失... Android Studio 4.0.1