更改 uri slug 时 PATCH 与 PUT 的不同 uri

Different uri for PATCH vs PUT when changing uri slug

在正确的 REST API 实现中,假设我正在编写 API 让用户修改 uri slug,例如将 /acme/first 更改为 /acme/second.

根据我提交的是部分记录 (patch) 还是当前代表 first 的整个记录​​ (put),uri 是否应该有所不同?

例如:

PUT /acme/second
{ [...], "current-slug": "first", "color": "blue" }

反对 new uri 因为 put 意味着 "this goes here."

对比

PATCH /acme/first
{ "new-slug": "second", "color": "blue" }

针对 old uri 的补丁,因为 patch 表示 "modify the thing that's here."

我怀疑这是一个边缘案例,但很有趣,因为几乎所有文档都恰好显示 putpatch 操作相同的 uri,尽管显然 post一般是不同的uri.

这绝对是一个边缘案例。执行此操作的一种明显的 HTTP 方法实际上就是 HTTP MOVE 方法。此方法来自WebDAV,但应该无处不在。

MOVE /acme/first HTTP/1.1
Destination: /acme/second

这将是我的最高推荐,因为它非常适合问题。

PATCHPUT 的奇怪之处在于它们都希望在目标 uri 更新资源,但操作的结果更类似于 DELETE,因为它删除了资源(并在其他地方创建了一个新资源)。

因此,我倾向于建议在这种情况下两者都不使用。这足以保证特殊的 POST 请求。

但是是的... MOVE 是完美的。任何不深入理解 MOVE 语义的 HTTP 客户端或服务器都应该将其视为类似于 POST(不安全,不是幂等的)。