是否需要 DELETE/PUT http 动词?

bur*_*1ce 5 rest http

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

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

Nic*_*tel 6

这实际上与 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返回图书资源的表示,则开发人员希望能够调用PUT相同的 URL 来更新该图书的信息,并将DELETE图书全部删除。(当然,如果他没有权限这样做,您实际上不会删除这本书,而是返回 403 'Forbidden' 或 405 'Method Not Allowed' 状态代码 - 这也是 HTTP 规范的一部分)

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

Darrel Miller 在他的回答中提出了另一个好观点。HTTP 方法都有一定的含义,也有一定的特点。例如,GET应该是一种安全的方法,用于在服务器端不做任何更改的情况下检索信息。而且PUTDELETE幂等的,这意味着(即使它们不是像 那样安全的方法GET)您可以根据需要进行任意数量的请求而不会产生任何不必要的副作用(删除一本书一到十次具有相同的效果:书不见了) . POST但是不是幂等的:如果您执行 10 个POST创建新书的请求,您很可能会得到 10 个重复的书条目。

由于这些特性,开发人员和工具能够做出某些假设。例如,搜索索引器(例如 Googlebot)只会执行GET请求,以免破坏服务器上的任何内容。但是,如果您http://example.com/api/books/123/delete为了删除一本书而使用 URL 违反了 HTTP 规范,那么有一天您可能会注意到您的数据库完全为空,因为 Google 一直在为您的网站编制索引。那不是 Google 的错,而是您的错,因为您没有遵循规范。

因此,长话短说:使用协议或标准(例如 HTTP)设定了某些期望,如果您随后偏离该协议,您将产生意想不到的行为和可能的不需要的副作用。


Dar*_*ler 4

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

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

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