【问题标题】:REST Response after updating a resource resulting in a location change更新资源导致位置更改后的 REST 响应
【发布时间】:2019-12-15 16:40:34
【问题描述】:

假设我有一个用户资源 (/users/{username}),客户端使用 PUT 更新用户名。在这种情况下,资源的位置会发生变化(因为用户名是 ID)。

这不是幂等的,因为您不能再次执行相同的请求并获得相同的结果。这是否意味着我必须改用 POST

另外,我不知道用哪个状态码回复。 201 (created) 似乎不正确,因为资源没有创建,只是更新了。另一方面,您必须将新位置提供给客户。

执行更新导致位置更改的最佳做法是什么?大概是为了禁止吧?

【问题讨论】:

  • tools.ietf.org/html/rfc7231#section-4.3.4;如果通过 PUT 更改资源的 location 意味着同一资源的后续 GET 将 404(或者更糟糕的是,成功但对于不同的资源),这在语义上似乎不正确。如果你有一个 3xx 可能没问题。
  • 是的,我完全同意你的看法,但这就是我的问题的重点。如何让用户更改用户名,同时仍然遵循 REST 原则而不使用代理键?

标签: rest http-headers put http-status-codes http-method


【解决方案1】:

拥有稳定的资源网址是一件好事。如果对资源的例行更改更改了它们的位置,这也可能对指向这些位置的其他事物不利。尤其是在更改之后,会出现 404,而不是 301 或 308 状态代码。

更改资源 URI 的最优雅方法可能是 MOVE HTTP 方法:

MOVE /user/foo HTTP/1.1
Destination: /user/bar

然而,尽管如此,PUT 最初会返回一个 2xx 代码,并且紧跟在 404 之后违反了PUT 的幂等性约束。

尽管第二个请求失败了,但是在第一个PUT 请求之后服务器的状态在第二个PUT 请求之后仍然是一样的。

不需要 2 个相同的幂等 HTTP 请求返回相同的状态。

【讨论】:

  • 您能否提供有关 MOVE 方法的更多信息的链接?我在规范中真的找不到任何东西。感谢您对幂等性的更正!
  • @Melkor 这是 HTTP 方法的官方列表,以及它们的定义位置:iana.org/assignments/http-methods/http-methods.xhtml。 MOVE 已添加到 WebDAV 扩展中,但并没有真正阻止它在其他 HTTP 应用程序中使用。
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2019-07-13
  • 2016-09-25
  • 2016-11-13
  • 2023-03-21
相关资源
最近更新 更多