多个资源上的REST部分更新

多个资源上的REST部分更新,rest,api-design,restful-url,Rest,Api Design,Restful Url,我有两种资源,商店和物品,一个商店可以通过它的ID唯一地标识,一个商店包含许多不同类型的物品。物品有代码来标识它们的类型,例如modelA的导线电缆有代码265,一个代码265的物品可以存在于多个商店中。 示例HTTP请求及其响应 GET /stores/1/items [{ "itemCode": 265, "itemDescription": "Conductor cable", "itemModel": "model1", "uom":"meter"

我有两种资源,商店和物品,一个商店可以通过它的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使用者移动,比如10米长的model1导体电缆从store 1移动到store 2。
我知道有两个补丁HTTP请求可以通过更新存储1和存储2中的数量来实现这一点,但我需要通过一个HTTP请求来实现这一点。

PATCH
并不是真正的restful。我不认为REST独自一人可以解决这个问题,因为它通常只处理单个资源

我所看到的唯一真正的RESTful方式是为每个模型创建资源(您可能无论如何都应该这样做),并从该模型更改它所属的集合(
collection
relationtype)


我在您的示例中没有看到任何链接,所以我假设您并没有真正寻找真正的RESTful方法。在这种情况下,我想说一个定制的
POST
请求在这里可能已经足够好了。

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

HTTP POST是一个很好的选择。将一定数量的商品从一家商店转移到另一家商店类似于在银行账户之间转账。在这种情况下,我会考虑创建以下端点:<代码> POST /存储/项目转移< /代码>。请求主体将包含源存储区/itemCode/itemQuantity和目标存储区。所有状态修改都将在单个事务中发生


就个人而言,我支持POST方法,但是如果您坚持使用补丁,并且Java是您的语言,那么我建议使用该库来处理RFC6902请求。我是它的作者。

PATCH
并一次修改多个资源,因此您可以通过一个请求修改多个资源为什么
PATCH
不应该是RESTful?它违反了什么约束才能不休息?甚至,他实际上也提出了休息。我想你只需要知道推特的线索。你在读我没读的东西吗?补丁程序有效地发送了一组修改资源的指令。它不传输状态。就这一点而言,
POST
也不是RESTful的,因为语义是由实现者定义的,您基本上可以发送您想要的任何内容,它可能会也可能不会影响一个或多个资源的状态。虽然REST完全是关于资源的,但是如果您向服务发送指令,告诉它如何修改资源以产生特定的状态,就可以了。您还可以通过
PUT
更新来实现状态转换,但效率要低得多,因为您必须发送整个更新的集合。那么除了在这两种情况下发送的数据负载之外,这里的实际区别是什么呢?@RomanVottner我同意,在这种情况下,
POST
也不是restful。我在回答中想说的是,OP可能不是在寻找一个真正的RESTful答案,应该只使用
POST
。为了简单起见,我省略了这些链接,因为我认为它们与我的问题无关<代码>我看到的唯一真正的RESTful方式是为每个模型创建资源您是指每个项目吗?我无法拥有项目集合,因为它们没有全局唯一标识符,项目仅存在于商店上下文中。