假设在正确的REST API实现中,我正在编写一个API,以使用户修改uri slug,例如将/acme/first
更改为/acme/second
。
根据我要提交的是当前代表patch
的部分记录(put
)还是整个记录(first
),uri是否应有所不同?
例如:
PUT /acme/second
{ [...], "current-slug": "first", "color": "blue" }
将 new uri放在相对位置,因为put
的意思是“这是这里。”
vs。
PATCH /acme/first
{ "new-slug": "second", "color": "blue" }
针对 old uri进行补丁,因为patch
的意思是“修改此处的内容。”
我怀疑这是一个极端情况,但是很有趣,因为实际上put
和patch
的所有文档碰巧都显示了相同的uri,尽管显然post
通常是另一个uri。
答案 0 :(得分:1)
这肯定是个边缘情况。一种明显的HTTP方法实际上就是HTTP MOVE
方法。此方法来自WebDAV,但应该可以在任何地方使用。
MOVE /acme/first HTTP/1.1
Destination: /acme/second
这是我的最佳建议,因为它非常适合该问题。
PATCH
或PUT
都奇怪的是,他们俩都希望在目标uri上更新资源 ,但是结果操作的过程与DELETE
更为相似,因为它删除了资源(并在其他地方创建了一个新资源)。
因此,我倾向于建议在这种情况下都不使用。这足以满足特殊的POST
请求。
但是,是的。MOVE
很完美。任何不深入了解MOVE
语义的HTTP客户端或服务器都应将其类似于POST
对待(不安全,不是幂等)。