在 Rest 中使用 POST 进行删除/更新?

Posted

技术标签:

【中文标题】在 Rest 中使用 POST 进行删除/更新?【英文标题】:Use POST for delete/update in Rest? 【发布时间】:2018-02-20 09:54:28 【问题描述】:

我明白(来自接受的答案What is the difference between HTTP and REST?) REST 只是一组关于如何使用 HTTP 的规则

接受的答案说

不,REST 是应该使用 HTTP 的方式。

今天我们只使用了一小部分 HTTP 协议的方法——即 获取和发布。 REST 方法是使用所有协议的 方法。

例如,REST 规定使用 DELETE 删除文档(被 它是 URI 后面的文件、状态等),而使用 HTTP,您可以 滥用 GET 或 POST 查询,例如 ...product/?delete_id=22

我的问题是什么缺点/缺点(技术或设计)如果我继续使用 POST 方法而不是 DELETE/PUT 来删除/更新 Rest 中的资源?

【问题讨论】:

【参考方案1】:

我的问题是什么是缺点/缺点(技术或设计) 如果我继续使用 POST 方法而不是 DELETE/PUT 删除/更新 Rest 中的资源?

POST 请求不是Idempotent,但DELETE 请求是Idempotent

幂等HTTP方法是可以多次调用而没有不同结果的HTTP方法

Idempotency 对于构建 fault-tolerant API 很重要。

假设客户端想要通过POST 更新资源。由于 POST 不是幂等方法,因此多次调用它可能会导致错误更新。如果您将 POST 请求发送到服务器,但您得到了超时,会发生什么情况。资源真的更新了吗?是在向服务器发送请求时发生超时,还是在响应客户端时发生超时?我们可以安全地重试一次,还是我们需要先弄清楚资源发生了什么?通过使用幂等方法,我们不必回答这个问题,但我们可以安全地重新发送请求,直到我们真正从服务器得到响应。

所以,如果你使用 POST 来删除,会有后果的。

【讨论】:

加 1 表示幂等提及【参考方案2】:

从纯粹的技术角度来看,我不知道任何真正的缺点。其他人提到幂等性,但这并不是仅仅通过使用 DELETE 就可以实现的,无论如何你仍然必须实现它。

这给我们留下了设计方面的考虑:

您的客户(或者更确切地说是针对您的 API 进行编程的程序员)可能合理地期望 DELETE 方法删除内容并使用 POST 方法添加内容。如果你不遵守这个约定,你就会混淆他们。 如果您使用 POST 来删除和添加内容,则必须发明另一种方式来告诉您实际要做什么。这当然不是很难,但它会无缘无故地让您的 API 变得更加复杂。 出于这两个原因,您将需要更多更好的文档,因为您没有遵循已经记录在案的 RESTful 原则。

【讨论】:

【参考方案3】:

当我们在 rest API 中使用 POST 而不是 Delete 时,我们正在从客户端抢夺 Idempotency 的力量。这意味着,通过使用POST 我们对我们的 API 用户说,这个 API 在多次点击时会产生不同的结果。

如果超时,API 用户必须查询资源 他提出了删除的请求。然后如果找到,他必须提出一个 调用 POST API 将其删除。

如果使用 Delete 方法发出相同的请求。那么我们保证 我们的 API 用户多次调用相同的方法将返回相同的 结果。因此他可以提出任意数量的请求,直到他得到 成功删除而不是超时没有查询。

注意:保持幂等性是 API 制作者的职责。仅仅放置 Delete 方法并不能赋予幂等性。

【讨论】:

【参考方案4】:

在 REST 通常我们知道 POST 用于添加内容,PUT 用于编辑现有数据中的内容,DELETE 用于删除内容,POST 请求是 not Idempotent,但 DELETE 请求是 @987654325 @。 虽然以上是定义,但在我看来,我们使用这些方法是因为对于 better understanding,该特定方法用于什么目的,并且通过使用这些方法,UI developerBackend developer 之间的桥梁不会被最小化。

如果你想使用 POST 方法而不是 DELETE/PUT 那么会有 没有任何影响,但这不是一个好的编码标准。

【讨论】:

以上是关于在 Rest 中使用 POST 进行删除/更新?的主要内容,如果未能解决你的问题,请参考以下文章

我应该对 REST 资源使用单数还是复数命名约定?

任何优先/更新竹构建队列的 REST 端点?

根据条件限制/锁定所有 Post/Delete Rest API 端点 [关闭]

通过 Django REST POST 更新模型实例

Rest模式get,put,post,delete含义与区别(转)

REST 接口学习