在适当的REST API实现中,假设我正在编写一个API来让用户修改uri slug,例如将/acme/first
更改为/acme/second
。
取决于我提交的部分记录(patch
)或目前代表put
的整个记录(first
),uri是否应该变化?
例如:
PUT /acme/second
{ [...], "current-slug": "first", "color": "blue" }
反对新的uri,因为put
意味着“这就在这里。”
与
PATCH /acme/first
{ "new-slug": "second", "color": "blue" }
补丁对旧的uri,因为patch
意味着“修改那里的东西。”
我怀疑这是一个边缘情况,但很有趣,因为几乎所有文档都恰好显示了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
(不安全,不是幂等)。