我应该使用 POST 还是 PUT 进行可以创建或更新的 API 调用

Posted

技术标签:

【中文标题】我应该使用 POST 还是 PUT 进行可以创建或更新的 API 调用【英文标题】:Should I use POST or PUT for API call that can create or update 【发布时间】:2016-09-30 11:35:14 【问题描述】:

我想知道是否应该使用 POST 或 PUT 进行 API 调用。

后端将在我的数据库中创建或更新现有行。我知道我使用 POST 进行创建和 PUT 进行更新,但是当我不知道哪个会切换创建/更新时我应该使用什么?

【问题讨论】:

【参考方案1】:

我不认为创建/更新的区别是决定 PUT 和 POST 的最佳方式。这是由rest cook book 支持的:

HTTP 方法 POST 和 PUT 不是 CRUD 的创建和更新的 HTTP 等效方法。

我建议你阅读那篇文章,但由于那里的一些 cmets 表示他们不明白,我将尝试以另一种方式解释。

    问问自己,如果在 PUT 或 POST 请求之后直接向同一 URL 发出 GET 请求会发生什么。如果您返回刚刚 PUT 或 POST 的相同数据,那么它可能应该是一个 PUT 请求。如果您必须转到不同的 URL 才能查看数据,那么它可能应该是 POST(您可以在响应中使用 Location 标头告诉客户端可以通过 GET 请求查看 POST 数据的位置)。 幂等性 比创建/更新或我是否可以向同一个 URL 发出 GET 请求更重要。 PUT 请求是幂等的(多次重复相同的请求与发出一次具有相同的效果),而 POST 请求则不是(多次发出相同的请求与发出一次不同)。如果您的请求在每次发出时都有额外的副作用,那么您必须使用 POST。

听起来你的请求是幂等的,而且你知道资源将在前面存在的确切 URL,所以我认为你应该使用 PUT。

正如 Rest cook book 文章中所说,使用 PUT 来创建和更新资源是完全可以的。

如果您可以使用 PUT,那么您应该使用它,因为它为客户提供了有关该服务的更多信息。例如,PUT 请求的容错性、弹性和分发要容易得多,因为您不关心同一个请求是否多次发生。构建发出 POST 请求的容错应用程序可能有点棘手,因为您必须确保请求只发生一次。实现重试逻辑也更容易 PUT 因为你不关心请求失败的地方,你可以重试因为幂等性。

为 POST 实现重试有点困难,因为客户端不确定请求是否成功,并且它必须假设发出多个 POST 请求可能会造成破坏。

【讨论】:

【参考方案2】:

使用 PUT api 调用。 POST 主要在创建数据时使用。

【讨论】:

但是数据也可以创建,还是用PUT创建和更新都“ok”? 如果是这种情况,那么您可以使用 POST。【参考方案3】:

如果您不知道要使用什么,请使用 POST。如果您不太确定,请参阅:http://restcookbook.com/HTTP%20Methods/put-vs-post/

【讨论】:

以上是关于我应该使用 POST 还是 PUT 进行可以创建或更新的 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

Http put与post区别

HTTP协议中PUT和POST使用区别

POST与PUT

Http之POST PUT

Rails Put 与 Post

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