是否需要DELETE / PUT http动词?

时间:2014-12-11 15:54:19

标签: rest http

我没有看到设计使用PUT和DELETE来更新和删除数据的REST API服务的巨大好处。通过使用POST和唯一的URL,可以轻松替换这两个动词。

我看到使用PUT和DELETE的唯一好处是它减少了REST API服务使用的URL的数量,这不是很多。我还有其他好处吗?

3 个答案:

答案 0 :(得分:4)

这实际上与REST没什么关系,但更多的是使用超文本传输​​协议(HTTP)。

HTTP的基本思想是在某个资源(由其URL标识)上执行某个操作(HTTP方法之一,如GET,POST,PUT和DELETE)。因此,如果您通过将操作添加到URL(例如http://example.com/api/books/123/delete)并使用其他HTTP方法开始偏离此操作,则表示您违反了HTTP协议。

这方面的缺点可能不会立即显现(因为它仍然有效),如果您只是自己使用API​​,则可能会受到限制。但是,如果其他程序员也在使用API​​,那么当您实际上不遵守协议时,通过声明您拥有RESTful HTTP API来创建某些期望。

例如,如果调用GET /api/books/123返回书籍资源的表示,开发人员希望能够在同一个URL上调用PUT来更新该书的信息,并{{1完全删除这本书。 (当然,如果他没有权限这样做,你实际上并没有删除这本书,而是返回403'Forbidden'或405'Fethod Not Allowed'状态代码 - 这也是HTTP规范的一部分)< / p>

但是,如果您偏离协议(基本上是发明自己的协议),则必须在某处描述,而不是调用DELETE开发人员必须调用DELETE /api/books/123。他们必须了解您所有API的自定义规则,因为您没有遵循标准。

Darrel Miller在回答中提出了另一个好处。 HTTP方法都具有一定的含义和特定的特征。例如,POST /api/books/123/remove/the/book应该是安全方法,用于检索信息而不在服务器端进行任何更改。 GETPUT 幂等,这意味着(即使它们不是安全的方法,如DELETE),您可以制作尽可能多的请求没有任何不必要的副作用(删除一到十次书具有相同的效果:书已经消失)。 GET但不是幂等的:如果您要创建一本新书的10 POST次请求,您很可能最终会有10个重复的图书条目。

由于这些特性,开发人员和工具能够做出某些假设。例如,Googlebot等搜索索引器只会执行POST个请求,以免破坏服务器上的任何内容。但是,如果您要通过使用网址GET来删除书籍来违反HTTP规范,您可能会在某一天注意到您的数据库已完全清空,因为Google已将您的网站编入索引。这不是谷歌的错,而是你的错,因为你没有遵守规范。

所以简而言之:使用协议或标准(例如HTTP)设置某些期望,如果您随后偏离协议,您将产生意外行为和可能的不良副作用。

答案 1 :(得分:3)

不需要使用PUT和DELETE来获得基于REST的系统的好处。

在某些情况下,使用更精确的方法可能是有利的。通常它是利用语义的中间组件。 PUT和DELETE是幂等方法,因此如果某个通用组件接收503,理论上它可以重试PUT / DELETE直到它获得成功响应。使用POST方法,中间人不能这样做。

使用DELETE方法,客户端知道不发送正文。使用PUT,它知道发送完整的表示。使用POST方法,您需要与客户端通信如何以其他方式发出请求,例如链接关系。

答案 2 :(得分:0)

你可以在没有PUT和DELETE的情况下生活。

本文告诉您原因:http://www.artima.com/lejava/articles/why_put_and_delete.html

..但是(引自Fielding):&#34; REST API不应包含对通信协议的任何更改,除了填写或修复标准协议的未指定位的详细信息,例如HTTP的PATCH方法或链接标题字段。破解实现的解决方法(例如那些足以让人相信HTML定义HTTP方法集的浏览器)应该单独定义,或者至少在附录中定义,期望解决方法最终会过时。 [这里的失败意味着资源接口是特定于对象的,而不是通用的。]&#34; (http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven