gpt4 book ai didi

api - 编辑冲突和 409 与 412 响应

转载 作者:可可西里 更新时间:2023-11-01 15:07:34 24 4
gpt4 key购买 nike

我们有一个 REST API,用于处理应用程序后端。我们需要实现一个冲突预防功能,它会根据编辑请求(POST/PUT)检查记录在客户端最后一次读取记录和现在之间是否没有被修改,如果是,就会告诉客户端存在冲突。

问题是如何发送冲突检查标记(很可能是时间戳,但我们不想强制执行)以及如何返回错误。

我们希望尽可能使用标准的 REST 模式,因此我们考虑了以下解决方案:

  • 使用 If-Modified-Since。这里的问题是它要求使用时间戳,而且规范说你必须返回 412。我们想返回更具体的 409 代码,以表明这是一个编辑冲突,as described in the spec ,而不是可能由其他原因引起的更通用的 412。这也将使客户端更容易对编辑冲突进行特殊处理,因为它们会有专门的错误代码。

  • 使用If-Match。更好,因为我们可以使用附加到它的任何数据,但规范再次要求使用 412,即使 409 更适合我们的情况。此外,规范建议 If-Match 链接到 Etag,我们不对数据使用 Etag,因为为每条记录计算正确的 Etag 是不可行的。我们有将用于检查的标签作为记录数据的一部分,但它不是作为 ETag 发送的,并且现有客户端不处理 ETag,因此如果可能的话,我们不想将这一新要求强加给客户端。

  • 使用自定义 X-Header。这会工作得很好,而且对于客户来说添加起来也很容易,但如果可能的话,我们更愿意使用标准的 REST 方式。

那么,在这种情况下,推荐的方法是什么?有没有一种方法可以使用标准的 REST 方式,用 409 响应并让它一切都干净整洁?

最佳答案

基本上,如果标题中有 If-* 前提条件,则必须返回 412。即使您使用自定义 X-Header,也只意味着 header 没有定义必须返回 412。如果使用自定义 header 作为前置条件,则应根据其定义返回412:

This response code allows the client to place preconditions on the current resource metainformation (header field data) ...

E-Tag 通常只作为 If-* 前提条件的一部分在请求中发送,所以如果你想要 409 那么你就不会不要使用 E-Tag

如果要使用409,只需将前置条件或后置条件放在请求正文中,而不是 header 。当条件失败时,WebDav 返回 403409409 当客户端可能能够修复请求时。 See RFC 3259 .

因此,总结一下:如果前提条件在 header 中,则使用 412,否则使用 409

关于api - 编辑冲突和 409 与 412 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17076349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com