gpt4 book ai didi

rest - RESTful POST 方法可以实现幂等吗?

转载 作者:可可西里 更新时间:2023-11-01 16:21:25 25 4
gpt4 key购买 nike

我正在设计一个管理收藏夹的 RESTful API。每个最喜欢的资源都可以包含两个项目的详细信息,这两个项目被视为最喜欢的一部分。

 HTTP POST /favorites

{ "item1" : "ball",
"item1-ID" : "1",
"item2" : "bat",
"item2-ID" : "2"
}

请原谅基本的 JSON 负载。然而,重点是 POST 的语义

上面的 POST 方法创建了一个新的最喜欢的资源(包含一个球(ID 1)和一个 bat (ID 2))

我的问题是关于发送两次相同的 POST 请求时的预期行为。第一个请求将创建一个收藏夹(如预期的那样)。发送第二个请求时应该发生什么?

1) 用 409 表示错误

2) 用 201 表示成功

1) 不是幂等的(因为 POST 是),而 2) 使 POST 是幂等的。

哪种方法是正确的?

最佳答案

您以错误的方式思考这个问题。如果 POST 创建了一个新资源,那么该资源应该有一个 URL 来标识它(例如,http://.../favorite/1)。当第二个具有相同负载的 POST 发生时,是否创建了一个新资源?如果是这样,那么您将拥有两个具有唯一 URL 的独立资源。如果您的应用程序不创建新资源,则第二个 POST 将返回与第一个相同的 URL。

编辑

RFC7231POST 部分不禁止它以幂等方式实现。它确实提供了一些指导:

  • 如果 POST 创建了一个新资源,那么它应该发送一个包含 Location 的 201(已创建)响应标识创建的资源的 header
  • 如果 POST 的结果等同于现有资源,则服务器可以通过返回 303(参见其他)和适当的 Location 将 UA 重定向到现有资源。标题

POST 不是更改资源状态的必需。但是,GETHEAD 是幂等的必需。我不知道更改服务器状态所需的任何方法。

就我个人而言,我将资源创建 POST 方法实现为将 303 重定向返回到资源的规范 URL 作为实践。我不知道 RFC 区分资源创建和重用响应的状态代码。这种方法的好处是它不需要在 POST 响应中包含创建的资源,并且对规范 URL 的 GET 将在任何中间缓存中缓存响应可能存在。它还允许实现不检索响应并使用规范 URL(来自 Location header )的智能客户端。

在您的情况下,我认为我会采用 303 方法,前提是收藏夹有自己的 URL;如果没有,201 会很奇怪。如果有很好的理由在响应中区分创建和重用情况,那么在创建新资源时返回 201,在重新使用时返回 303。我不会返回 409,除非您的应用程序要求您拒绝创建已存在的资源。

关于rest - RESTful POST 方法可以实现幂等吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com