我没有看到设计使用PUT和DELETE来更新和删除数据的REST API服务的巨大好处。通过使用POST和唯一的URL,可以轻松替换这两个动词。
我看到使用PUT和DELETE的唯一好处是它减少了REST API服务使用的URL的数量,这不是很多。我还有其他好处吗?
答案 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
应该是安全方法,用于检索信息而不在服务器端进行任何更改。 GET
和PUT
幂等,这意味着(即使它们不是安全的方法,如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)