Angularjs REST乐观锁定和多重看跌期权

Angularjs REST乐观锁定和多重看跌期权,angularjs,rest,Angularjs,Rest,据我所知,PUT请求不应该返回任何内容。 考虑客户端希望运行这个伪代码: x = resource.get({id: 1}); x.field1 = "some update"; resource.put(x); x.field2 = "another update"; resource.put(x); (假设我有一个输入控件和一个“保存”按钮,这允许我更改输入控件中显示的对象“x”的一部分,然后在按钮上单击“将更改放入服务器”,然后继续编辑,可能还会将另一个更改“保存”到“x”) 按照关于如

据我所知,PUT请求不应该返回任何内容。 考虑客户端希望运行这个伪代码:

x = resource.get({id: 1});
x.field1 = "some update";
resource.put(x);
x.field2 = "another update";
resource.put(x);
(假设我有一个输入控件和一个“保存”按钮,这允许我更改输入控件中显示的对象“x”的一部分,然后在按钮上单击“将更改放入服务器”,然后继续编辑,可能还会将另一个更改“保存”到“x”)

按照关于如何在RESTAPI中实现乐观锁定的不同建议,上面的代码一定会失败,因为get()返回的“x”的版本标记(无论如何实现)在put()之后将变得过时。 那你们这些人通常是怎么做到的? 或者您只是在每次放置后重新获取对象吗?

您可以对HTTP使用“条件”操作,例如此处描述的
If Match
标题:

简而言之:您使用
GET
请求传递
ETag
,并在
If Match
标题中将该
ETag
提供给服务器。如果您试图
PUT
的资源有另一个
ETag
,服务器将以失败响应。如果自头以来未修改,也可以对
使用简单的时间戳

当然,您必须让服务器代码理解条件请求


对于多个步骤,
PUT
确实可以返回新的表示,因此它也可以包含新的
ETag
或时间戳。即使服务器没有返回一个
PUT
的新表示形式,如果没有修改,您仍然可以使用响应中的
时间戳,因为
条件
PUT

这里可能是我想要的: 他们含蓄地说我们可以从PUT返回ETag。虽然只有在案例中,服务器应用了给定的更改,但没有进行任何更正

然而,这又提出了另一个问题。在现实世界中,应用程序PUT调用程序将在JS gui中异步运行,如我在问题中的示例所示。因此,在输入或不输入任何更改的情况下,可能会多次按下“保存”按钮。如果我们不使用乐观锁定,那么假定的PUT幂等性可以使每次单击按钮都安全地发送另一个PUT查询,只要最后一个按钮获胜(但实际上如果有更改,则不能保证,因此问题仍然存在)

但是使用乐观锁定,当第一次PUT成功时,它返回updatered ETag,好吗?如果有另一个PUT请求正在运行,仍然使用过时的标记版本,则后一个请求将得到412,用户将看到一条消息“其他人更改了资源”-但实际上这是我们以前的更改


你通常做什么来防止这种情况?是否禁用“保存”按钮,直到其请求完全完成?如果超时怎么办?或者您认为如果是超时,可以看到并发更改错误消息,因为稳定性已经受到影响了吗?

我想我可以从PUT返回一个更新的ETag响应头,但我觉得从概念上讲,它与在响应体中返回内容没有什么不同。PUT不应该归还任何东西,是吗?谢谢。所以基本上你的建议归结为“你必须从PUT返回一些东西来使用多个PUT,无论是更新的数据对象还是带有更新ETag的头”?还是我遗漏了什么?看起来这些都是我在问题中描述的想法:)实际上,让我困扰的是,PUT不应该返回任何东西。看一看——或者说,他们只是说“不需要响应正文”“不需要响应正文”是正确的,规范没有说您必须返回某些内容,它甚至有一个响应代码(
204 no Content
)来表示这一点。它没有说
PUT
不应该返回任何内容。它实际上意味着,如果对象的客户端视图发生了变化,您就应该这样做,我认为这正是您的用例。