如何将ETag/If-Match与多个项目一起使用

stu*_*ith 14 rest etag http

在RESTful接口中处理乐观锁定的推荐方法似乎是ETag从GET 返回一个并If-Match在PUT上提供一个,即:

GET /items/1  --> gives client an ETag for a single item
PUT /items/1  <-- client gives it back as If-Match for checking
Run Code Online (Sandbox Code Playgroud)

如何将此方案与多个项目一起使用,例如,如果我要批量从单个URI中获取多个项目:

GET /items    --> How do I return multiple ETags for multiple items here? 
Run Code Online (Sandbox Code Playgroud)

或者,如果ETags/If-Match不能应对这种情况,那么推荐的方法是什么?或者我应该自己动手?

Six*_*aez 20

tl; dr:可以将etags分配给包含"集合"的资源,但是在确定有效的etag时,由应用程序来管理该集合中项目的标识/更改.

REST架构风格中的资源并不意味着它是单个项目或集合.它只是表示工作流中给定点的应用程序状态.资源将包含描述性数据,并希望链接到工作流中该点的可能后续步骤.工作流程可以像获取订单状态一样简单,也可以像电子商务网站上的订购商品一样复杂,并且可以取消订单.

一个ETAG是用于确定特定状态(资源)是否达到最新与否的机构.将etag分配给返回数据集合的资源意味着您的应用程序正在识别该点处的集合项的状态,并且如果这些项中的任何内容发生更改,则先前的etag值将不再有效.由您的应用程序决定何时更改集合项以及如何识别各个项目.换句话说,etags适用于资源,但不适用于给定资源的各个组件.

  • 我发现的另一种方法是使用返回内容的哈希值。在这种情况下,哈希将在集合上计算,因此是 ETag 标头的候选者。但是,这个 ETag 如何用于乐观锁定?例如,客户端可能决定更新集合中的一个项目,但他没有这个特定项目的哈希值。 (2认同)
  • 也许有时候您必须对API有点儿聊天。如果要对集合中的项目执行更新,请针对其资源URI执行头请求,然后使用该Etag进行乐观锁定 (2认同)