我应该使用 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 中多次使用它
我知道 PATCH 应该更新现有资源并且 POST 应该创建一个新资源。但是,我当前的端点必须同时更新和创建。
例如:买家向卖家支付购买商品的款项,因此他们的账户余额应该发生变化,并且还应该创建新的付款交易。
我正在考虑在响应正文中返回 Transaction 对象。我应该使用哪种方法?
通常 PUT
是 创建和更新的正确方法。
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 中多次使用它