REST-архитектура для нескольких удалений? - PullRequest
7 голосов
/ 22 сентября 2011

Я отправляю запрос на удаление на сервер как:

@RequestMapping(value = "/user/{userId}", method = RequestMethod.DELETE)

для удаления одного пользователя. Однако что делать, если несколько пользователей хотят удалить? Я хочу подчиняться REST-архитектуре, но я хочу увидеть другие способы отправки нескольких запросов на удаление?

PS: Это подходящий способ:

@RequestMapping(value = "/user", method = RequestMethod.DELETE, headers = "Accept=application/json")
    public void deleteUser(HttpServletResponse response, @RequestBody String users) throws IOException {
        ...
}

Ответы [ 4 ]

6 голосов
/ 22 сентября 2011

, поскольку отдых - это ресурс-ориентированная арка.

попробуйте создать объект домена более высокого уровня, который представляет ресурс «нескольких пользователей»,

удалить этот объект.

возможно

@RequestMapping(value = "/users/expired", method = RequestMethod.Delete)

Великая книга Суббу Алламараджу, «О, 1010», книга отдыха , посвященная успокоительным веб-сервисам.

  • глава 11.10, как пакетно обрабатывать похожие ресурсы;
  • глава 11.11, как запустить пакетную операцию;
  • глава 11.12, когда использовать post для объединения нескольких запросов;
  • глава 11.13, как поддержать пакетный запрос
2 голосов
/ 09 января 2013

Я достаточно знаком с REST, чтобы признать, что использование POST для достижения DELETE является отклонением от соответствия REST. Я не могу точно указать причину, по которой это хорошее правило.

Я подозреваю, что это может быть связано с осуществимостью API-независимого инструментария (например, инструмента dev, который делает такие предположения о состоянии реализации, основываясь на данных об определениях глаголов, без необходимости конфигурирования, чтобы понять, что определенные методы API) или невозможность вернуть мелкозернистые ошибки в случае частичного успешного удаления, но это всего лишь предположения, которые не имеют решающего значения в этом вопросе.

Ответ Сванлю относится к использованию URL-адресов, представляющих конструкцию группировки в качестве цели удаления, но в приведенном примере «/ users / expired» предлагается фиксированная (и, возможно, определяемая системой) группировка. Более ориентированный на пользователя случай произвольной коллекции все еще требует перечисления в какой-то момент для достижения.

Выдача N УДАЛЕНИЙ для группы размера N не является привлекательной, как из-за сложной задержки, так и из-за отсутствия атомарности, но УДАЛЕНИЕ ОСТАЛОСЬ может предназначаться только для одного ресурса.

Я думаю, что лучшая практика, подразумеваемая ответом Сванлиу, могла бы состоять в определении операции POST, способной создать ресурс, который станет новым родительским объектом содержания для удаляемых объектов. POST может вернуть тело, поэтому рассматриваемая система может создать уникальный идентификатор для этого ресурса, не относящегося к доменной группировке, и вернуть его клиенту, который может развернуться и выдать второй запрос на УДАЛЕНИЕ. Ресурс, созданный POST, является недолговечным, но целенаправленным - это каскады прекращения действия к объектам домена, которые были желаемой целью операции массового удаления.

> POST /users/bulktarget/create
> uid=3474&uid=8424&uid=2715&uid=1842&uid=90210&uid=227&uid=66&uid=54&uid=8
> ...
< ...
< 200 OK
< ae8f2b00e

> DELETE /users/bulktarget/ae8f2b00e
> ...
< ...
< 200 OK

Конечно, два сетевых обмена менее желательны, чем просто один, но, учитывая, что меньшее массовое удаление - это два объекта, и для его выполнения потребуется две операции DELETE, это кажется справедливым компромиссом - думайте об этом, как о вас » каждый объект, за исключением второго, становится бесплатным.

1 голос
/ 22 сентября 2011

Мое понимание REST - это именно то, что вы должны делать.Если есть альтернатива, которую я тоже хотел бы узнать:)

Если вы не хотите отправлять несколько запросов на удаление, вам нужно разработать более грубый API.(именно поэтому большинство API-интерфейсов есть RESTful, а не REST) ​​

Кстати, я думаю, вам нужен RequestMethod.DELETE?

0 голосов
/ 22 сентября 2011

AFAIK основной REST для работы с одним ресурсом.Я бы пошел с POST к ресурсу /user/ и специальным deleteUsers телом, содержащим идентификаторы для удаления.

...