首页 > 解决方案 > 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维修请求的某个对象。如果已设置,则必须为真。quantityis_brokenrepair_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我需要执行以下步骤:

  1. 查找A, 其中是: 带有和A的自行车group_id==Xis_broken==false
  2. 创建B,设置quantity=Q, is_broken=true
  3. ,AA.quantity = A.quantity - Q
  4. 保存全部

这将创建新实例并修改原始实例。有一个要求,我只能拥有一个带有group_id=Xand的实例is_broken=false,因此当自行车B被修复时,它们会在单个事务中通过以下步骤合并回来:

  1. 查找A, 其中是: 带有和A的自行车group_id==Xis_broken==false
  2. 如果没有找到,更新 B ( is_broken=false, repair_request_id=null)
  3. 如果发现:
    1. A.quantity = A.quantity+B.quantity
    2. 删除 B

合并可以用PUT /bikes/:id. 这可能会返回一个已发送的不同实例,但这对我来说很好。

问题在于拆分操作。我的要求是:

我目前的想法:

  POST /bikes/1/operations/set_broken

  payload:
  {
     "quantity": Q
  }

  response (after split):
  [
    {
      "id": 1,
      [...]
      "is_broken": false
    },
    {
      "id": 2,
      [...]
      "is_broken": true
    }
  ]  

你觉得清楚吗?或者您知道这种情况下更好的设计模式吗?

标签: resthttpapi-design

解决方案


推荐阅读