我有一个REST URI用于资源列表,例如:
http://foo.com/group/users
这些用户中的每一个都有一个序列号,我想公开一种方法,为集合中的所有用户重新编号这些值,并使访问列表的每个人都可以使用此更改。由于这是对整个集合的一个动作,我不知道如何实现这一点。
我可以设想一个像这样的URL http://foo.com/group/users?sequence=normalize
但不是 PUT
也不是 POST
除非我使用新数字作为消息数据提交整个集合,否则对整个列表确实有意义。
如何以RESTful方式更新整个集合,而无需重新发送集合中的所有更新资源?
在raffian对我最初的回应发表评论之后,我将我的回答重新设计为更加RESTful ......
此方法通常旨在部分更新资源的状态。对于列表资源,我们可以发送一个列表,其中只包含要更新的元素和列表中元素的标识符。以下请求将是:
PATCH /group/users
[
{ "id": "userId1", "sequence": "newSequenceNumber1" },
{ "id": "userId2", "sequence": "newSequenceNumber2" },
(...)
]
此方法通常用于在资源管理的列表中添加元素。因此,如果您想利用它来执行此操作,我们需要在请求中传递有关要执行的操作的提示。我们可以选择在专用标头中或在有效负载内添加它。
随着 标题方法,你会有类似的东西:
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" },
(...)
]
}
}
希望它能帮到你,
蒂埃里
在raffian对我最初的回应发表评论之后,我将我的回答重新设计为更加RESTful ......
此方法通常旨在部分更新资源的状态。对于列表资源,我们可以发送一个列表,其中只包含要更新的元素和列表中元素的标识符。以下请求将是:
PATCH /group/users
[
{ "id": "userId1", "sequence": "newSequenceNumber1" },
{ "id": "userId2", "sequence": "newSequenceNumber2" },
(...)
]
此方法通常用于在资源管理的列表中添加元素。因此,如果您想利用它来执行此操作,我们需要在请求中传递有关要执行的操作的提示。我们可以选择在专用标头中或在有效负载内添加它。
随着 标题方法,你会有类似的东西:
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" },
(...)
]
}
}
希望它能帮到你,
蒂埃里
您可以在URI上同时使用PATCH和POST。如果我是你,我会使用PATCH。这是批量更新的最佳解决方案。
从语义上讲, HTTP PATCH方法 是正确的方法。这也在描述中 目前选择的答案。
PATCH /group/users
[
{ "id": "userId1", "sequence": "newSequenceNumber1" },
{ "id": "userId2", "sequence": "newSequenceNumber2" },
...
]
但是,所选答案中描述的第二种方法并不简单,因为您在POST请求中发明了新动词。这是SOAP,而不是REST。