Обновление всей коллекции ресурсов способом REST

У меня есть REST URI для списка ресурсов, например:

http://foo.com/group/users

Каждый из этих пользователей имеет порядковый номер, и я хочу показать способ перенумерации этих значений для всех пользователей в коллекции и сделать это изменение доступным для всех, кто обращается к списку. Поскольку это действие для коллекции в целом, я не уверен, как это сделать.

Я могу представить такой URL, как http://foo.com/group/users?sequence=normalize, но ни один из PUT и POST не имеет смысла для всего списка, если я не передам всю коллекцию с новыми номерами в качестве данных сообщения.

Как я могу сделать обновление для всей коллекции, как это в RESTful, без необходимости повторной отправки всех обновленных ресурсов в коллекции?

Ответ 1

После рафийского комментария к моему первоначальному ответу я переработал свой ответ, чтобы быть более 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" },
            (...)
        ]
    }
}

Надеюсь, это поможет вам, Thierry

Ответ 2

Вы можете использовать PATCH и POST для URI. Я бы использовал ПУТЬ, если бы был вами. Это лучшее решение для массовых обновлений.

Ответ 3

Семантически, метод HTTP PATCH - это правильный путь. Это также описано в выбранном в данный момент ответе.

PATCH /group/users

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

Однако второй метод, описанный в выбранном ответе, не успокаивается, потому что вы изобрели новые глаголы внутри запроса POST. Это SOAP, а не REST.