我应该使用 PATCH 还是 POST 同时创建和更新资源?

Should I use PATCH or POST to create and update a resource at the same time?

我知道 PATCH 应该更新现有资源并且 POST 应该创建一个新资源。但是,我当前的端点必须同时更新和创建。

例如:买家向卖家支付购买商品的款项,因此他们的账户余额应该发生变化,并且还应该创建新的付款交易。

我正在考虑在响应正文中返回 Transaction 对象。我应该使用哪种方法?

通常 PUT 创建和更新的正确方法。

如果客户端不能确定目标URI,则应使用

POST,但如果客户端可以确定目标URI,则PUT最好的方法。

例如,如果这篇文章还不存在,PUT /article/hello-world 应该 return 201 创建,如果存在并被替换,则为 204/200。

但是,我对你的具体情况有一些保留意见。在您的示例中,它听起来像:

  • 您正在创建一个新交易
  • 这应该会影响现有账户的余额

客户端也很可能不会决定目标 URI 是什么。

那我主要就是从交易的角度来考虑这个操作。如果您想传达事务对其他资源有影响,您可能需要为此使用 Link header。

例子

请求

POST /transactions HTTP/1.1
Content-Type: application/json

{
  "from": "/accounts/123",
  "to": "/accounts/456",
  "quantity": "55.00"
}

回复:

HTTP/1.1 201 Created
Location: /transactions/555513412
Link: </account/123>; rel="invalidates"
Link: </account/456>; rel="invalidates"

请注意,'invalidates' link 关系处于草稿状态,但这是个好主意,我已在我们的 API 中多次使用它