ETag使用和资源修改

时间:2015-05-12 13:07:22

标签: rest concurrency etag

上下文

我有2个资源 - 这是一个例子,不要注意它的相关性 - 它们是连在一起的:

  • /customers/{id}提供有关客户的年龄,性别,名字等的信息。
  • /customers/{id}/age,对应于客户的年龄属性。对于性能问题,此资源存在。为了符合HATEOAS约束,从/customers/{id}资源提供了一个链接。

问题

应用程序可以在/customers/{id}/customers/{id}/age资源上使用 PUT 执行更新。

由于年龄属性与两种资源相关,因此可以通过两种不同的方式更新年龄,从而导致冲突。 所以ETag似乎是解决我问题的银弹;-)!

问题

此示例的两个基本问题,更为一般:

  • 资源更新是否会导致将此资源的ETag(显而易见的)修改为其他资源? 在我的示例中,资源/customers/{id}/age的更新修改了两个资源的etag。这个和/customers/{id}
  • ETag的修改是否有条件? 我的意思是,如果应用程序在更新/customers/{id}资源而不是年龄时仅修改firstName,我不想更新/customers/{id}/age资源的ETag。

一个更普遍的问题:是否有一些关于使用ETag标题的良好做法,或者我可以做我想做的任何事情?

1 个答案:

答案 0 :(得分:1)

这种情况经常出现。将资源视为一种层次(即一棵树)通常很自然地将“父母”项目依赖于他们的孩子,而孩子们不一定依赖于他们的父母。更新叶子项目时,即ETag发生变化时,该效果会一直波动到根目录。

一个例子是CardDAV,其中地址簿的“ctag”取决于集合中所有vCard条目的ETag。在这种情况下,ctag没有明确表示为ETag,但它很可能已经存在。