以REST方式更新整个资源集合

时间:2015-02-20 20:58:03

标签: rest http

我有一个资源列表的REST URI,例如:

http://foo.com/group/users

这些用户中的每一个都有一个序列号,我想公开一种方法,为集合中的所有用户重新编号这些值,并使访问列表的每个人都可以使用此更改。由于这是对整个集合的一个动作,我不知道如何实现这一目标。

我可以设想像http://foo.com/group/users?sequence=normalize这样的网址,但PUTPOST对整个列表都没有意义,除非我用新数字作为消息提交整个集合数据

如何以RESTful方式更新整个集合,而无需重新发送集合中的所有更新资源?

3 个答案:

答案 0 :(得分:15)

在raffian对我的初步回复发表评论之后,我将我的回答重新设计为更加RESTful ......

  • 使用方法PATCH

此方法通常用于部分更新资源的状态。在列表资源的情况下,我们可以发送仅包含要更新的元素的列表以及列表中元素的标识符。以下请求将是:

PATCH /group/users
[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    (...)
]
  • 使用列表资源上的POST方法

此方法通常用于在资源管理的列表中添加元素。因此,如果您想利用它来执行此操作,我们需要在请求中传递有关要执行的操作的提示。我们可以选择在专用标头中或在有效负载内添加它。

使用标头方法,您将拥有类似的内容:

POST /group/users
X-Action: renumbering
[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    (...)
]

使用有效负载方法,您将拥有类似的内容:

POST /group/users
{
    "action": "renumbering",
    "list": {
        [
            { "id": "userId1", "sequence": "newSequenceNumber1" },
            { "id": "userId2", "sequence": "newSequenceNumber2" },
            (...)
        ]
    }
}

希望它可以帮到你, 亨利

答案 1 :(得分:2)

您可以在URI上同时使用PATCH和POST。如果我是你,我会使用PATCH。这是批量更新的最佳解决方案。

答案 2 :(得分:1)

从语义上讲, HTTP PATCH method是正确的方法。这也在currently chosen answer中描述。

PATCH /group/users

[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    ...
]

但是,所选答案中描述的第二种方法并不简单,因为您在POST请求中发明了新动词。这是SOAP,而不是REST。