REST-архитектура для нескольких удалений?
Я отправляю запрос на удаление на сервер как:
@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 ответа
Так как отдых - это ресурс-ориентированная арка.
попробуйте создать объект домена более высокого уровня, который представляет ресурс "нескольких пользователей",
удалить на этом объекте.
может быть
@RequestMapping(value = "/users/expired", method = RequestMethod.Delete)
Великая книга Subbu Allamaraju Subaru Allamaraju, посвященнаявеб-сервисам, рассказывает на эту тему:
- глава 11.10, как пакетно обрабатывать похожие ресурсы;
- глава 11.11, как запустить пакетную операцию;
- глава 11.12, когда использовать post для объединения нескольких запросов;
- глава 11.13, как поддержать пакетный запрос
Я достаточно знаком с REST, чтобы признать, что использование POST для достижения DELETE является отклонением от соответствия REST. Я не могу точно указать причину, по которой это хорошее правило.
Я подозреваю, что это может быть связано с осуществимостью API-независимого инструментария (например, инструмента dev, который делает такие предположения о состоянии реализации, основанные на данных об определениях глаголов, без необходимости настройки для понимания того, какие конкретные методы API). do) или невозможность вернуть мелкозернистые ошибки в случае частичного успешного удаления, но это всего лишь предположения, которые не имеют решающего значения в этом вопросе.
Ответ Сванлю относится к использованию URL-адресов, представляющих конструкцию группировки в качестве цели удаления, но в приведенном примере "/users/expired" предлагается фиксированная (и, возможно, определяемая системой) группировка. Более ориентированный на пользователя случай произвольной коллекции все еще требует перечисления в некоторый момент для достижения.
Выдача N DELETE для группы размера N не является привлекательной как из-за сложной задержки, так и из-за отсутствия атомарности, но REST DELETE может предназначаться только для одного ресурса.
Я думаю, что лучшая практика, подразумеваемая ответом Сванлиу, могла бы состоять в определении операции 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, это кажется справедливым компромиссом - думайте об этом, как будто вы получаете все объект за второй бесплатный.
Мое понимание REST - это именно то, что вы должны сделать. Если есть альтернатива, я бы тоже хотел узнать:)
Если вы не хотите отправлять несколько запросов на удаление, вам нужно разработать более грубый API. (именно поэтому большинство API там RESTful, а не REST)
Кстати, я думаю, что вам нужно RequestMethod.DELETE?
AFAIK основной REST для работы с одним ресурсом. Я бы пошел с POST
к /user/
ресурс и специальный deleteUsers
тело, содержащее идентификаторы для удаления.