更改 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."
我怀疑这是一个边缘案例,但很有趣,因为几乎所有文档都恰好显示 put
与 patch
操作相同的 uri,尽管显然 post
一般是不同的uri.
这绝对是一个边缘案例。执行此操作的一种明显的 HTTP 方法实际上就是 HTTP MOVE
方法。此方法来自WebDAV,但应该无处不在。
MOVE /acme/first HTTP/1.1
Destination: /acme/second
这将是我的最高推荐,因为它非常适合问题。
PATCH
或 PUT
的奇怪之处在于它们都希望在目标 uri 更新资源,但操作的结果更类似于 DELETE
,因为它删除了资源(并在其他地方创建了一个新资源)。
因此,我倾向于建议在这种情况下两者都不使用。这足以保证特殊的 POST
请求。
但是是的... MOVE
是完美的。任何不深入理解 MOVE
语义的 HTTP 客户端或服务器都应该将其视为类似于 POST
(不安全,不是幂等的)。
在正确的 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."
我怀疑这是一个边缘案例,但很有趣,因为几乎所有文档都恰好显示 put
与 patch
操作相同的 uri,尽管显然 post
一般是不同的uri.
这绝对是一个边缘案例。执行此操作的一种明显的 HTTP 方法实际上就是 HTTP MOVE
方法。此方法来自WebDAV,但应该无处不在。
MOVE /acme/first HTTP/1.1
Destination: /acme/second
这将是我的最高推荐,因为它非常适合问题。
PATCH
或 PUT
的奇怪之处在于它们都希望在目标 uri 更新资源,但操作的结果更类似于 DELETE
,因为它删除了资源(并在其他地方创建了一个新资源)。
因此,我倾向于建议在这种情况下两者都不使用。这足以保证特殊的 POST
请求。
但是是的... MOVE
是完美的。任何不深入理解 MOVE
语义的 HTTP 客户端或服务器都应该将其视为类似于 POST
(不安全,不是幂等的)。