【发布时间】:2011-02-02 02:55:17
【问题描述】:
为 HTTP DELETE 请求提供参数有什么非 RESTful 的吗?
我的场景是我正在建模“你确定要删除它吗?”设想。在某些情况下,资源的状态表明请求的删除可能无效。您可以自己想象一些需要确认删除的场景
我们采用的解决方案是给删除请求传递一个参数,表示可以继续删除("?force_delete=true")
例如
DELETE http://server/resource/id?force_delete=true
我相信它仍然很平静,因为:
(a) DELETE 的语义没有改变 - 用户仍然可以发送正常的 DELETE 请求,但是这可能会失败并显示 409,响应正文将解释原因。我说可能会失败,因为(出于不值得解释的原因)在某些情况下没有理由提示用户。
(b) Roy 的论文中没有任何内容表明它违背了 REST 的精神——为什么会有,因为 HTTP 只是 REST 的一种实现,那么为什么传递 HTTP 参数很重要
有人可以指出一个明确的声明来说明这不是 RESTful 的原因吗?
在一个相关问题上,如果用户没有指定 force_delete,那么我将返回 409 Conflict - 这是最合适的响应代码吗?
跟进
经过进一步研究,我认为在DELETE中添加参数可能会违反几个原则。
首先是实现可能违反了“统一接口”(参见Roy's dissertation的第5.1.5节
通过添加“force_delete”,我们在已经明确定义的 DELETE 方法上添加了一个额外的约束。这个约束只对我们有意义。
您也可以争辩说它违反了“5.1.2 客户端-服务器”,因为确认对话实际上是一个 UI 问题,而且并非所有客户端都希望确认删除。
有人建议吗?
【问题讨论】:
-
Roy 论文的网址包含一个“)”,导致 404。ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm 有效。