REST,HTTP DELETE和参数

有没有什么非RESTful提供HTTP DELETE请求的参数?

我的情景是,我正在模拟“你确定要删除吗?” 场景。 在某些情况下,资源的状态表明请求的删除可能无效。 您可以自己想象一些需要确认是否需要删除的场景

我们采用的解决scheme是将parameter passing给删除请求,以表明可以继续删除(“?force_delete = true”)

例如

DELETE http://server/resource/id?force_delete=true 

我相信它还是宁静的,因为:

(a)DELETE的语义没有被改变 – 用户仍然可以发送正常的DELETE请求,但是这可能会失败 ,并且响应的主体将解释原因。 我说可能会失败,因为在某些场合(不值得解释的原因)没有理由提示用户。

(b)在Roy的论文中没有任何内容表明它违背了REST的精神 – 为什么会有,因为HTTP只是REST的一个实现,所以为什么传递的HTTP参数很重要

有人能指出我的一个明确的说法,指出为什么这不是RESTful的原因?

在相关的问题上,如果用户没有指定force_delete,那么我将返回409 Conflict – 是最合适的响应代码?

跟进

经过一些进一步的研究,我认为向DELETE中添加参数可能违反了几个原则。

首先是实现可能违反了“统一接口”(见Roy的论文第5.1.5节)

通过添加'force_delete',我们在已经很好定义的DELETE方法上添加了一个额外的约束。 这个约束只对我们有意义。

你也可以争辩说,它违反了“5.1.2客户端 – 服务器”,因为确认对话实际上是一个用户界面的问题,并不是所有的客户端都要确认删除。

build议任何人?

不,这不是RESTful。 您应该将动词( force_delete )放入URI的唯一原因是,如果您需要在PUT / DELETE方法不可用的环境中重载GET / POST方法。 从您使用DELETE方法来判断,情况并非如此。

在出现阻止RESTful服务执行操作的冲突的情况下,应该使用HTTP错误代码409/Conflict ,但是用户仍然有可能自己解决冲突。 预删除确认(在没有实际冲突的情况下可以防止删除)本身并不是冲突,因为没有任何东西阻止API执行请求的操作。

正如亚历克斯所说(我不知道谁低估了他,他是正确的),这应该在用户界面中处理,因为这样一个RESTful服务只是处理请求,因此应该是无状态的(即它不能依靠确认关于请求的任何服务器端信息)。

两个例子如何在UI中做到这一点将是:

  • pre-HTML5 :*向用户显示一个JS确认对话框,并且只有在用户确认后才发送请求
  • HTML5 :*使用一个窗体,其中的表单只包含“确认”和“取消”button(“确认”将是提交button)

(*)请注意,5以前的HTML版本本身不支持PUT和DELETE HTTP方法,但大多数现代浏览器都可以通过AJAX调用来执行这两种方法。 有关跨浏览器支持的详细信息,请参阅此主题 。


更新 (根据额外的调查和讨论):

服务需要force_delete=true标志的场景违反了Roy Fielding论文中定义的统一接口 。 此外,根据HTTP RFC ,DELETE方法可能会在源服务器(客户端)上被覆盖,这意味着目标服务器(服务)上没有这样做。

所以,一旦服务收到一个DELETE请求,它应该处理它,而不需要任何额外的确认(不pipe服务是否实际执行操作)。

我觉得这是不安宁的。 我不认为宁静的服务应该处理强迫用户确认删除的要求。 我会在用户界面中处理这个。

如果这是一个程序的API,指定force_delete = true是否有意义? 如果有人正在编写一个脚本来删除这个资源,你想强制他们指定force_delete = true来真正删除资源吗?

这是一个古老的问题,但这里有一些意见…

  1. 在SQL中,DELETE命令接受一个参数“CASCADE”,它允许你指定从属对象也应该被删除。 这是一个有意义的DELETE参数的例子,但是“man rm”可以提供其他的参数。 如何在没有参数的情况下在REST / HTTP中实现这些情况?
  2. @Jan,它似乎是一个成熟的约定,URL的path部分标识一个资源,而查询string不(至less不一定)。 例子比比皆是:获得相同的资源,但格式不同,获取资源的特定字段等。如果我们将querystring作为资源标识符的一部分,就不可能有“同一资源的不同视图”的概念,而不转向诸如HTTP内容协商的非RESTful机制(由于许多原因,这可能是不希望的)。

除了Alex的回答:

请注意, http:// server / resource / id?force_delete = true标识的是与http:// server / resource / id不同的资源。 例如,删除/ customers /?status = old或/ customers /是一个巨大的差异。

一月