【发布时间】:2013-11-06 19:38:40
【问题描述】:
处理必须通过不向 API 使用者公开的另一种方法修改/更新的资源属性的最佳方法是什么?
例子:
请求用于 X 的新令牌。令牌必须按照一组特定的业务规则/逻辑生成。
在旧汇率到期后请求/刷新货币汇率。该汇率仅供参考,将用于后续交易。
请注意,在上述两个示例中,值是资源的属性,而不是单独的资源。
处理这些类型的场景以及 API 使用者无法控制属性值但需要请求新属性值的其他场景的最佳方法是什么。一种选择是允许 PATCH 在请求正文中具有该特定属性,但实际上并不将属性更新为指定的值,而是运行必要的逻辑来更新属性并返回更新后的资源。
让我们更详细地看一下#1:
请求:
GET /User/1
回应:
{
"Id": 1,
"Email": "myemail@gmail.com",
"SpecialToken": "12345689"
}
作为 API 的使用者,我希望能够请求一个新的SpecialToken,但生成令牌的业务规则对我来说是不可见的。
在 REST 范例中,我如何告诉 API 我需要一个新的/刷新的 SpecialToken?
一个想法是:
请求:
PATCH /User/1
{
"SpecialToken": null
}
服务器会看到这个请求并知道它需要刷新令牌。后端会用特定算法更新SpecialToken,并返回更新后的资源:
回应:
{
"Id": 1,
"Email": "myemail@gmail.com",
"SpecialToken": "99999999"
}
此示例可以扩展到示例 #2,其中SpecialToken 是资源CurrencyTrade 的汇率。 ExchangeRate 是只读值,API 的使用者不能直接更改,但可以请求更改/刷新:
请求:
GET /CurrencyTrade/1
回应:
{
"Id": 1,
"PropertyOne": "Value1",
"PropertyTwo": "Value2",
"ExchangeRate": 1.2
}
使用 API 的人需要一种方法来请求新的 ExchangeRate,但他们无法控制值是什么,严格来说是 read only property。
【问题讨论】:
-
为什么不能直接禁止 PUT?
-
@JonathanW - 我不关心更新的授权,而是如何创建对 REST 有意义的端点以允许消费者请求更新的属性?
-
您能否将请求消息与响应消息分开并标记?我很难跟上。
-
我修复了一些错误并突出显示了请求/响应消息。