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:*使用带有操作删除的表单,其中表单仅包含“确认”和“取消”按钮(“确认”将是提交按钮)
更新(基于其他调查和讨论):
服务将要求出现
force_delete=true
标志的场景违反了Roy Fielding博士论文中的定义。此外,根据,delete方法可能在源服务器(客户端)上被覆盖,这意味着这不是在目标服务器(服务)上完成的
因此,一旦服务收到删除请求,它应该在不需要任何额外确认的情况下处理该请求(无论服务是否实际执行该操作)。除了Alex的回答之外:
注意http://server/resource/id?force_delete=true 标识不同于的资源http://server/resource/id. 例如,删除/customers/?status=old还是/customers/这是一个老问题,但这里有一些评论
您能解释一下违反了哪个REST约束吗?考虑到URI对客户端应该是不透明的,为什么您认为使用HTTP DELETE删除一个资源不能满足客户端的期望
DELETE http://server/resource/id?force_delete=true