rest - RESTful API 设计:涉及多个资源的操作
问题描述
我有以下模型:
class Bikes:
id: int # primary key
group_id: int # for split/merge (see below)
quantity: int # number of items
is_broken: bool # true if all are broken
repair_request_id: int # reference to some RepairReqest (if broken).
repair_request_id
设置为描述自行车RepairRequest
维修请求的某个对象。如果已设置,则必须为真。quantity
is_broken
repair_request_id
我的 RESTful API:
GET /bikes # returns list
GET /bikes/:id # returns single instance
PUT /bikes/:id # updates existing or adds new instance on list, returns instance data
is_broken=true
使用 PUT,我可以通过设置和将 Bikes 标记为损坏repair_request_id=R
。
现在我需要添加一个操作,允许RepairRequest
通过将单个实例一分为二来添加具有 group_id=X 的部分自行车。
假设我想在单笔交易中添加quantity=Q
自行车维修请求,group_id=X
我需要执行以下步骤:
- 查找
A
, 其中是: 带有和A
的自行车group_id==X
is_broken==false
- 创建
B
,设置quantity=Q, is_broken=true
- ,
A
集A.quantity = A.quantity - Q
- 保存全部
这将创建新实例并修改原始实例。有一个要求,我只能拥有一个带有group_id=X
and的实例is_broken=false
,因此当自行车B
被修复时,它们会在单个事务中通过以下步骤合并回来:
- 查找
A
, 其中是: 带有和A
的自行车group_id==X
is_broken==false
- 如果没有找到,更新 B (
is_broken=false, repair_request_id=null
) - 如果发现:
- 放
A.quantity = A.quantity+B.quantity
- 删除 B
- 放
合并可以用PUT /bikes/:id
. 这可能会返回一个已发送的不同实例,但这对我来说很好。
问题在于拆分操作。我的要求是:
- 后端应决定是否需要进行拆分或仅调用为 HTTP PUT 创建的相同处理程序。
- 我不想在 REST API 中公开事务——一个 HTTP 请求就是一个事务。
我目前的想法:
POST /bikes/1/operations/set_broken
payload:
{
"quantity": Q
}
response (after split):
[
{
"id": 1,
[...]
"is_broken": false
},
{
"id": 2,
[...]
"is_broken": true
}
]
你觉得清楚吗?或者您知道这种情况下更好的设计模式吗?
解决方案
推荐阅读
- django - 如何在 ReactJS 中嵌入获取的图像
- swift - 在 UITableView 中显示 Firebase 数据
- python - 我们如何创建一个 Kivy 可滚动弹出窗口?
- linux - 修补后使用 .sh 脚本自动化 ZRP 协议
- c# - 检查列表中的重复值 - 这可以更优雅吗?
- python - tf.train.GradientDescentOptimizer 可以使用任意函数接受任意输入吗?
- laravel - npm run watch 卡在加载中
- c++ - 长度为 20 的计算数组输出 23 个字符
- node.js - 是否需要从源代码“构建”一个 Node.js 应用程序才能在没有 babel 的生产环境中使用?
- javascript - Paper JS 无法通过 Rectangle 打洞