我看到使用PUT和DELETE的唯一好处是它减少了REST API服务使用的url数量,这并不多.我还有其他好处吗?
这实际上与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来更新该书的信息,并删除以完全删除该书. (当然,如果他没有权限这样做,你实际上并没有删除这本书但是你返回了403’Forbidden’或405’Fethod Not Allowed’状态代码 – 这也是HTTP规范的一部分)
但是,如果你偏离协议(基本上是发明你自己的协议),你将不得不在某处描述而不是调用DELETE / api / books / 123开发人员必须调用POST / api / books / 123 / remove / the / book .他们必须了解您所有API的自定义规则,因为您没有遵循该标准.
Darrel Miller在回答中提出了另一个好处. HTTP方法都具有一定的含义和特定的特征.例如,GET应该是一种安全的方法,用于检索信息而不在服务器端进行任何更改.并且PUT和DELETE是幂等的,这意味着(即使它们不是像GET这样的安全方法)你可以根据自己的喜好制作任意数量的请求,而不会产生任何不必要的副作用(删除一到十次的书具有相同的效果:本书离开了).然而,POST不是幂等的:如果你做了10个POST请求来创建一本新书,你很可能会得到10个重复的书籍条目.
由于这些特性,开发人员和工具能够做出某些假设.例如,Googlebot等搜索索引器只会执行GET请求,以免破坏服务器上的任何内容.但是,如果您为了删除图书而使用URL http://example.com/api/books/123/delete违反HTTP规范,您可能会在某一天注意到您的数据库完全为空,因为Google一直在索引您的网站.这不是谷歌的错,而是你的错,因为你没有遵守规范.
因此,简而言之:使用协议或标准(例如HTTP)设置某些期望,如果您随后偏离协议,您将创建意外行为和可能的不良副作用.