REST、HTTP和DELETE参数 为HTTP删除请求提供参数是否有任何非RESTful的地方?

REST、HTTP和DELETE参数 为HTTP删除请求提供参数是否有任何非RESTful的地方?,http,rest,Http,Rest,我的场景是,我正在模拟“您确定要删除那个吗?”场景。在某些情况下,资源的状态表明请求的删除可能无效。您可能可以自己想象一些需要确认删除的场景 我们采用的解决方案是将一个参数传递给delete请求,以指示可以继续删除(“?force_delete=true”) e、 g 我相信它仍然是宁静的,因为: (a) DELETE的语义没有改变-用户仍然可以发送一个正常的DELETE请求,但是409可能会失败,响应的主体将解释原因。我说可能会失败,因为(由于不值得解释的原因)在某些情况下没有理由提示用户。


我的场景是,我正在模拟“您确定要删除那个吗?”场景。在某些情况下,资源的状态表明请求的删除可能无效。您可能可以自己想象一些需要确认删除的场景 我们采用的解决方案是将一个参数传递给delete请求,以指示可以继续删除(“?force_delete=true”)

e、 g

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

(a) DELETE的语义没有改变-用户仍然可以发送一个正常的DELETE请求,但是409可能会失败,响应的主体将解释原因。我说可能会失败,因为(由于不值得解释的原因)在某些情况下没有理由提示用户。 (b) Roy的论文中没有任何内容表明这违背了REST的精神——既然HTTP只是REST的一个实现,为什么会有这种情况呢?那么传递HTTP参数又有什么意义呢


有人能给我指出一个明确的说法,明确这不是宁静的原因吗? 在一个相关的问题上,如果用户没有指定强制删除,那么我将返回
409 Conflict
-这是最合适的响应代码吗


跟进 经过进一步研究,我认为在DELETE中添加参数可能会违反几个原则

第一个是实现可能违反“统一接口”(参见第5.1.5节)

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

您还可以争辩说,它违反了“5.1.2客户机-服务器”,因为确认对话框实际上是一个UI问题,而且并非所有客户机都希望确认删除


有人建议吗?

我认为这是非restful的。我不认为restful服务应该处理强制用户确认删除的要求。我会在UI中处理


如果这是一个程序的API,那么指定force\u delete=true有意义吗?如果有人正在编写脚本来删除此资源,您是否希望强制他们指定force\u delete=true来实际删除此资源?

不,它不是RESTful。您应该放置动词(
force\u delete
)的唯一原因是如果在PUT/DELETE方法不可用的环境中需要重载GET/POST方法,则将其放入URI中。从DELETE方法的使用情况来看,情况并非如此

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

正如Alex所说(我不知道是谁否决了他,他是正确的),这应该在UI中处理,因为RESTful服务本身只处理请求,因此应该是无状态的(即,它不能通过保存请求的任何服务器端信息来依赖确认)

在UI中执行此操作的两个示例是:

  • HTML5之前版本:*向用户显示一个JS确认对话框,并仅在用户确认后发送请求
  • HTML5:*使用带有操作删除的表单,其中表单仅包含“确认”和“取消”按钮(“确认”将是提交按钮)
(*)请注意,5之前的HTML版本不支持本地放置和删除HTTP方法,但是大多数现代浏览器可以通过AJAX调用执行这两种方法。有关跨浏览器支持的详细信息,请参阅


更新(基于其他调查和讨论):

服务将要求出现
force_delete=true
标志的场景违反了Roy Fielding博士论文中的定义。此外,根据,delete方法可能在源服务器(客户端)上被覆盖,这意味着这不是在目标服务器(服务)上完成的


因此,一旦服务收到删除请求,它应该在不需要任何额外确认的情况下处理该请求(无论服务是否实际执行该操作)。

除了Alex的回答之外:


注意http://server/resource/id?force_delete=true 标识不同于的资源http://server/resource/id. 例如,删除/customers/?status=old还是/customers/

这是一个老问题,但这里有一些评论

  • 在SQL中,DELETE命令接受一个参数“CASCADE”,该参数允许您指定还应删除依赖对象。这是一个有意义的DELETE参数示例,但“man rm”可以提供其他参数。在没有参数的情况下,如何在REST/HTTP中实现这些情况
  • @Jan,这似乎是一个公认的惯例,URL的路径部分标识资源,而querystring不标识资源(至少不一定)例子比比皆是:获取相同的资源,但以不同的格式,获取资源的特定字段,等等。如果我们考虑QuiSQL字符串作为资源标识符的一部分,就不可能有“相同资源的不同视图”的概念,而不必转向诸如HTTP内容协商之类的非休息机制。(由于许多原因,这可能是不可取的)

  • 您能解释一下违反了哪个REST约束吗?考虑到URI对客户端应该是不透明的,为什么您认为使用HTTP DELETE删除一个资源不能满足客户端的期望
    DELETE http://server/resource/id?force_delete=true