我们有一个rest api,用于处理应用程序后端。我们需要实现一个冲突预防功能,它将在编辑请求(post/put)时检查在客户端上次读取记录到现在之间是否没有修改记录,如果是,将告诉客户端存在冲突。
问题是如何发送冲突检查标记(这很可能是一个时间戳,但我们不想强制它)以及如何返回错误。
我们希望尽可能使用标准的rest模式,因此我们考虑的解决方案如下:
自修改后使用。这里的问题是它强制使用时间戳,而且规范还说必须返回412。我们希望返回更具体的409代码,以表明这是一个编辑冲突,as described in the spec,而不是更一般的412,这可能是由其他原因引起的。这也将使客户端更容易对编辑冲突进行特殊处理,因为它们将具有专用的错误代码。
使用if match。更好,因为我们可以使用任何附加到它的数据,但规范再次要求使用412,即使409更适合我们的情况。此外,规范还建议,如果match与etag相关联,我们不会对数据使用etag,因为为每个记录计算适当的etag是不可行的。我们有标签,我们将使用作为记录数据的一部分,但它不发送ETag和现有客户端不处理ETAGS,所以我们不想强加给客户的新要求,如果可能的话。
使用自定义X报头。这将工作得很好,将是非常容易为客户添加,但我们更喜欢使用标准的休息手段,如果可能的话。
那么,在这种情况下,推荐的方法是什么?有没有一种方法可以使用标准的休息方式,用409来回应,让一切都很好和干净?

最佳答案

基本上,如果标题中有If-*前提条件,则必须返回412。即使使用customX-Header,也只意味着header没有定义,它说它必须返回412。如果使用自定义头作为前提条件,则应根据其定义返回412
此响应代码允许客户端在当前资源元信息(头字段数据)上放置前置条件…
E-Tag通常只作为If-*先决条件的一部分发送请求,因此如果您想要409则不会使用E-Tag
如果要使用409,只需将前置条件或后置条件放在请求正文中,而不是放在头中。当条件失败时,webdav返回403409409客户端可能能够修复请求的时间。See RFC 3259
因此,总结一下:如果你的前提条件在标题中,那么使用412,否则使用409

10-08 02:02