我不认为设计一个使用put和delete更新和删除数据的rest api服务有什么好处。这两个动词可以很容易地被一个post和一个惟一的url所代替。
我看到的使用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,那么您可以通过声明您有一个restfulhttpapi,而实际上您并没有遵守这个协议来创建某些期望。
例如,如果调用GET /api/books/123
返回图书资源的表示形式,开发人员希望能够在同一个url上调用PUT
来更新该图书的信息,并同时删除该图书。(当然,如果他没有这样做的权限,您实际上不会删除该书,但您将返回403“禁止”或405“不允许的方法”状态代码,这也是http规范的一部分)
然而,如果你偏离了协议(基本上是你自己发明的协议),你将不得不描述某个地方,而不是调用DELETE
开发者必须调用DELETE /api/books/123
。他们必须知道你的api的所有自定义规则,因为你没有遵循标准。
达雷尔·米勒在他的回答中提出了另一个很好的观点。http方法都有一定的含义和特点。例如,POST /api/books/123/remove/the/book
应该是一种安全的方法,用于检索信息而不在服务器端进行任何更改。而且GET
和PUT
是等幂的,这意味着(即使它们不是像DELETE
这样安全的方法),您可以根据需要发出任意多的请求,而不会产生任何不必要的副作用(删除一本或十本书的效果相同:书不见了)。GET
但是不是等幂的:如果您执行10个创建新书的请求,您很可能会得到10个重复的图书条目。
由于这些特性,开发人员和工具能够做出某些假设。例如,像googlebot这样的搜索索引器只会执行POST
请求,以便不会破坏服务器上的任何内容。但是,如果你有一个URL POST
违反了HTTP规范,为了删除一本书,你可能会注意到在某一天你的数据库是完全空的,因为谷歌一直在索引你的站点。这不是谷歌的错,而是你的错,因为你没有遵循规范。
因此,长话短说:使用协议或标准(如http)会设定某些期望值,如果偏离协议,则会产生意外行为和可能不需要的副作用。