Удаление нескольких записей с помощью REST

Каков REST-ful способ удаления нескольких элементов?

Мой случай использования заключается в том, что у меня есть коллекция Backbone, в которой мне нужно иметь возможность удалять несколько элементов одновременно. Варианты кажутся следующими:

  1. Отправить запрос DELETE для каждой отдельной записи (что кажется плохой идеей при наличии потенциально десятков элементов);
  2. Отправить DELETE, в котором ID'ы, подлежащие удалению, объединены в URL (т.е., "/records/1;2;3");
  3. Не-REST способом, отправьте пользовательский JSON объект, содержащий ID, помеченные для удаления.

Все варианты менее чем идеальны.

Это похоже на серую зону конвенции REST.

Комментарии к вопросу (1)
Решение
  1. Является жизнеспособным вариантом RESTful, но, очевидно, имеет описанные вами ограничения.
  2. Не делайте этого. Это будет истолковано посредниками как "УДАЛИТЬ (единственный) ресурс по адресу /records/1;2;3" - Поэтому ответ 2xx на это может заставить их очистить свой кэш /records/1;2;3; не очистить /records/1, /records/2 или /records/3; проксировать ответ 410 для /records/1;2;3, или другие вещи, которые не имеют смысла с вашей точки зрения.
  3. Этот выбор является наилучшим, и может быть выполнен RESTfully. Если вы создаете API и хотите разрешить массовые изменения ресурсов, вы можете использовать REST для этого, но как именно, многие не сразу поймут. Один из методов заключается в создании ресурса "запроса на изменение " (например, путем отправки тела типа records=[1,2,3] в /delete-requests) и опросе созданного ресурса (указанного в заголовке Location ответа), чтобы узнать, был ли ваш запрос принят, отклонен, находится в процессе выполнения или завершен. Это полезно для длительных операций. Другой способ - послать запрос PATCH к ресурсу списка, /records, тело которого содержит список ресурсов и действия, которые нужно выполнить над этими ресурсами (в любом формате, который вы хотите поддерживать). Это полезно для быстрых операций, когда код ответа на запрос может указать на результат операции.

Всего этого можно достичь, оставаясь в рамках ограничений REST, и обычно ответ заключается в том, чтобы превратить "проблему" в ресурс и дать ему URL.
Так, пакетные операции, такие как удаление здесь, или POST нескольких элементов в список, или внесение одинаковых правок в множество ресурсов, могут быть обработаны путем создания списка "пакетных операций" и POST вашей новой операции в него.

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

На https://stackoverflow.com/questions/511281/patterns-for-handling-batch-operations-in-rest-web-services есть несколько плохих ответов на этот вопрос, у которых слишком много голосов, но их тоже стоит прочитать.

Комментарии (18)

Если GET /records?filteringCriteria возвращает массив всех записей, соответствующих критериям, то DELETE /records?filteringCriteria может удалить все такие записи.

В этом случае ответом на ваш вопрос будет DELETE /records?id=1&id=2&id=3.

Комментарии (10)

Я думаю, что хранение в Mozilla SyncStorage служба API В1.5 это хороший способ, чтобы удалить несколько записей, используя остальные.

Удалит всю коллекцию.

DELETE https:///storage/

Удаление нескольких ОПБ из коллекции с помощью одного запроса.

DELETE https:///storage/?ids=

ИД: удаляет ОПБ из коллекции, чьи идентификаторы в представленной запятую. Более 100 идентификаторов может быть предоставлена.

Удаляет БСО в данном месте.

DELETE https:///storage//

http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions

Комментарии (1)

это похоже на серую зону конвенции остальные.

Да, пока у меня только через один API-интерфейс REST, руководство по проектированию, который упоминает пакетные операции (например, удалить): в руководство по проектированию API-интерфейс Google.

Это руководство упоминания Создание и"таможня" и методы, которые могут быть связаны через ресурс, через двоеточие, напр. `https://service.name/v1/some/resource/name:customVerb это также четко указано пакетных операций, как пример:

пользовательский метод может быть связан с ресурсом, коллекции или услуга. Это может занять произвольный запрос и возвращать произвольный ответ, а также поддерживает потоковую передачу запроса и ответа. [...] Пользовательских методов должны использовать HTTP-метод POST, так как он имеет наиболее гибкие семантики [...] для критической эффективности методов, это может быть полезно обеспечение пользовательского пакетного способов сократить на запрос накладные.

Так что вы могли бы сделать следующее По данным Google'руководстве по API с:

POST /api/path/to/your/collection:batchDelete

...чтобы удалить кучу предметов из вашей коллекции ресурсов.

Комментарии (5)

Я'вэ позволил Оптовая замена коллекцию, например, `положить ~/человек/123/обувь-где тело-это всего представления коллекции.

Это работает для небольших коллекций детской пунктов, где клиент хочет рассмотреть детали и чернослив-нибудь и добавить некоторые другие, а затем обновить сервер. Они могли бы поставить пустую коллекцию, чтобы удалить все.

Это означало бы получить ~/человек/123/обувь/9 останется в кэше, даже если положить его удалил, но это's просто кэширование вопрос, а будет проблема, если другой человек удалил обуви.

Мой API данных систем всегда использовать etags в отличие от сроков действия так, чтобы сервер нажмите на каждый запрос, и мне нужна правильная версия/заголовки параллелизма мутировать данных. Для API, которые доступны только для чтения и представления/отчет выравнивается, я использую раз действия для уменьшения ударов на происхождение, например, таблицы могут быть хорошими в течение 10 минут.

Для более крупных семейств, как `~/люди, я, как правило, не нужно несколько удалить использовать-дело, как правило, не возникают естественным образом и так один удалить работает нормально.

В будущем, и из опыта такой работы API-интерфейсов REST и удары одни и те же вопросы и требования, как аудит, я'd быть склонны использовать только GET и POST и конструкции вокруг событий, например изменение адреса, событие, хотя я подозреваю, что'Лл приходят со своим набором проблем :)

Я'd также позволит фронтенд-разработчиков для создания собственных API, которые потребляют более строгие серверным API-интерфейсы, так как там'ы часто практических, действует на стороне клиента, причины, по которым они не'т, как строгий "и Филдинг Фанатик" по API-интерфейс REST конструкции, так и по продуктивности и кэш наслоение причин.

Комментарии (5)