【问题标题】:REST Partial update on multiple resourcesREST 对多个资源的部分更新
【发布时间】:2017-08-23 09:49:04
【问题描述】:

我有两种资源,商店和物品,商店可以通过它的 ID 唯一标识,商店包含许多不同类型的物品。物品有代码来一般识别它们的类型,例如导体电缆modelA 的代码为 265,代码 265 的商品可以存在多个商店。 示例 HTTP 请求及其响应。

GET /stores/1/items
    [{
    "itemCode": 265,
    "itemDescription": "Conductor cable",
    "itemModel": "model1",
    "uom":"meter",
    "quantity": 30
    },
    {
    "itemCode": 122,
    "itemDescription": "Low-fat Milk",
    "itemModel": "model2",
    "uom":"liter",
    "quantity": 15
    }]
GET /stores/2/items
    [{
    "itemCode": 265,
    "itemDescription": "Conductor cable",
    "itemModel": "model1",
    "uom":"meter",
    "quantity": 25
    }]


GET /stores/3/items
    [{
    "itemCode": 122,
    "itemDescription": "Low-fat Milk",
    "itemModel": "model2",
    "uom":"liter",
    "quantity": 20
    }]

我想要的是一个 REST Api 端点,它可以让 Api 消费者移动,比如模型 1 的 10 米导体电缆从商店 1 到商店 2。 我知道有两个 PATCH HTTP 请求可以通过更新商店 1 和 2 中的数量来实现这一点,但我需要通过一个 HTTP 请求来实现这一点。

【问题讨论】:

  • PATCH can have side effects 并一次修改多个资源,因此您可以一次请求修改多个资源

标签: rest api-design restful-url


【解决方案1】:

如果您想使用 HTTP PATCH 实现此目的,那么 JSON Patch - RFC 6902 应该会很有帮助。它允许在单个请求中发送多个操作,因此可以同时更新多个资源和属性。如果任何操作失败,那么整个补丁也应该失败。但是,在请求中,您必须指定项目的新最终数量。您不能定义从当前值中减去的操作。所以为了让这个解决方案在多用户环境中工作,乐观锁定机制是必须的。否则必然会发生数据损坏。

HTTP POST 是一个不错的选择。将一定数量的商品从一家商店转移到另一家商店类似于在银行账户之间转移资金。在这种情况下,我会考虑创建以下端点:POST /stores/item-transfer。请求正文将包含源存储/itemCode/itemQuantity 和目标存储。所有状态修改都将在单个事务中发生。

我个人赞成 POST 方法,但是如果您坚持使用 PATCH 并且 Java 是您的语言,那么我建议使用 Tomoko 库来处理 RFC 6902 请求。我是它的作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2016-02-15
    • 2023-03-21
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多