【发布时间】:2021-12-30 08:48:02
【问题描述】:
我有一个 REST API,想为某些资源实现不同的状态。 API 位于Richardson Maturity Model 的第 2 级。
我已经看到了很多关于改变状态的端点的不同方法,但我不确定推荐的方法是什么。
我的场景如下:我的实体是订单。订单可以打开、关闭和进行中。
- 我可以使用请求正文向
/orders/{id}发出PATCH请求
{
"state": "in-progress"
}
- 我可以向端点
/orders/{id}/status/in-progress添加一个动作参数并发出POST请求来触发该动作。但这会有 RPC 的味道。 - 我可以将状态视为资源并发出
PUT请求来更新它。/orders/{id}/state
{
"state": "in-progress"
}
除此之外,我不确定响应正文中应该包含什么。
- 响应只能是
202 Accepted,没有正文。 - 或
200 Ok,更新状态为正文。
{
"state": "in-progress"
}
- 或带有订单的
200 Ok,它的更新状态为正文。
{
"id": 1
"state": "in-progress"
}
- 或带有订单的
200 Ok,它的更新状态+下一个可能的状态作为正文。这感觉像是迈向超媒体/成熟度 3 级的一小步。
{
"id": 1
"state": "in-progress"
"nextStates": ["closed"]
}
有很多机会。似乎我无法对资源等端点进行建模,应该如何为 RESTful API 进行建模。但我也不想使用 RPC 中的操作。 而且我知道,如果你有超媒体,那就只能是 REST,但实现起来既复杂又昂贵。
【问题讨论】:
-
没有通用标准,您分享的所有内容都没有明显错误。超媒体也可以免费使用=)
-
我的建议是你找到一个设计 RESTful api 的好标准,并尽量坚持下去。
标签: api rest state api-design state-machine