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

Nic*_*tch 16 rest http

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

http://foo.com/group/users
Run Code Online (Sandbox Code Playgroud)

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

我可以设想一个类似于URL http://foo.com/group/users?sequence=normalize但是对于整个列表既不是PUT也不是POST真的有意义,除非我使用新数字作为消息数据提交整个集合.

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

Thi*_*ier 17

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

  • 使用该方法 PATCH

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

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

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

使用标头方法,您将拥有类似的东西:

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

使用有效载荷方法,您将拥有类似的东西:

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

希望它对你有帮助,蒂埃里

  • 我认为您应该考虑利用HTTP标头`ETag`和`If-Match`来实现与REST的optimitic锁定.此链接可能会让您感兴趣:https://looselyconnected.wordpress.com/2010/03/25/the-http-etag-header-and-optimistic-locking-in-rest/.希望它能帮到你. (4认同)

Ray*_*Luo 7

从语义上讲,HTTP PATCH 方法是正确的方法当前选择的答案中也描述了这一点。

PATCH /group/users

[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    ...
]
Run Code Online (Sandbox Code Playgroud)

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