【问题标题】:Meaning of ETag in firebase responseFirebase响应中ETag的含义
【发布时间】:2019-11-18 08:58:47
【问题描述】:

您能否解释一下 ETag 标头在 firebase 函数调用时的 firebase 响应中是什么意思? 改写问题。 就我而言,我不需要 ETag,我想改变行为。 我该如何实现?

例如,我在云端有一个简单的函数返回 json:

const getObject = functions.https.onCall((data, context)=>({x:1, y:2}));

在浏览器中,我看到 ETag 出现在 http 响应中,正如您所见,我没有从处理程序中的云存储中获取任何数据。 下一个问题,对可调用函数的调用(例如,在 angularfire 中)转换为 http POST 请求,在 onCall 处理程序中修改响应以强制在客户端和反向代理端缓存任意 json 数据的最佳方法是什么?

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    ETag 标头有以下用途:

    ETag HTTP 响应标头是资源特定版本的标识符。它允许缓存更有效,并节省带宽,因为如果内容没有更改,Web 服务器不需要发送完整的响应。另一方面,如果内容发生了变化,etag 有助于防止资源的同时更新相互覆盖(“空中冲突”)。

    【讨论】:

    • 在常识上我理解这一点,但问题是在firebase的上下文中,为什么firebase会在这种情况下生成ETag。就我而言,它增加了流量,我不想要这个标题或给我控制这种行为的方法
    • @Oleg 这不是 Firebase,这是普通的 HTTP 协议,而“特定版本资源的标识符”当然适用。例如。想象一下两个客户端操作相同的资源,这正是“空中碰撞”的含义。缓存时,缓存需要遵守 ETag 标识符(网络浏览器可能会透明地处理这个,所以这取决于它是什么类型的客户端)。
    • 如您所见 const getObject = functions.https.onCall((data, context)=>({x:1, y:2})); firebase 站点(Web 服务器)上的简单功能。所有与 http 相关的东西都在 firebase 上执行。函数返回对象firebase做出响应后,将其转换为http响应。这确实意味着 firebase 团队控制标头和其他 http 内容的数据代码。我试图第二次告诉你 ETag 标头是 firebase 团队的创意,他们决定使用 Etag 来遵守一些做法。
    • @Oleg ETag 根本不是 Firebase 特定的——尽管事实上它是该标头的理想用例......对什么是好的描述与给定的场景完全匹配,例如。与多个 WebSocket 客户端。对于一个客户端,它只会影响缓存,因为空中碰撞是不可能的。
    【解决方案2】:

    您使用 ETag 进行有条件的更新。通常当您不想覆盖其他用户对文档的更改时。

    另一个用例是当您对文档进行部分更新并且更改假定文档的其余部分在此期间没有更改时;有不变量需要保护。

    不要将此与事务的并发模型混淆。服务器端 SDK 只是不断重试由写入争用引起的失败。这只是粗暴地强制您进行更改。

    这更适用于用户已经编辑客户订单 10 分钟,然后将其保存,但其他一些用户(例如客户服务人员)已经进行了更改,因此您不能覆盖他们的更改,否则他们的更改会丢失。

    因此,您需要通知用户其他人更改了内容,他们需要重新加载并可能丢失他们的编辑。

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 1970-01-01
      • 2018-02-23
      • 2019-03-15
      • 2011-12-18
      • 2013-10-06
      • 2021-07-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多