更新资源导致位置更改后的 REST 响应

REST Response after updating a resource resulting in a location change

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

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

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

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

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

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

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

然而,尽管如此,PUT 最初 return 一个 2xx 代码并且在 404 之后立即 not 违反了幂等约束PUT.

尽管第二个请求失败,第一个 PUT 请求后的服务器状态在第二个 PUT 请求后仍然相同。

不需要 2 个相同的幂等 HTTP 请求达到 return 相同的状态。