Что такое REST-полный способ удаления нескольких элементов?
Мой вариант использования состоит в том, что у меня есть Backbone Collection, в которой мне нужно удалить несколько элементов одновременно. Варианты кажутся такими:
- Отправлять запрос DELETE для каждой отдельной записи (что кажется плохой идеей, если потенциально существует несколько десятков элементов);
- Отправьте DELETE, где идентификаторы для удаления объединены в URL (например, «/ records / 1; 2; 3»);
- Не в режиме REST отправьте пользовательский объект JSON, содержащий идентификатор, помеченный для удаления.
Все варианты далеко не идеальны.
Это похоже на серую зону соглашения REST.
api
rest
backbone.js
Дональд Тейлор
источник
источник
Ответы:
/records/1;2;3
». Таким образом, ответ 2xx на это может заставить их очистить свой кеш/records/1;2;3
; не чистить/records/1
,/records/2
или/records/3
; проксировать ответ 410/records/1;2;3
или другие вещи, которые не имеют смысла с вашей точки зрения.records=[1,2,3]
to/delete-requests
) и опросить созданный ресурс (указанный вLocation
заголовке ответа), чтобы узнать, был ли ваш запрос принят, отклонен, выполняется ли или завершил. Это полезно для длительных операций. Другой способ - отправитьPATCH
запрос к ресурсу списка ,/records
, тело которого содержит список ресурсов и действий, которые нужно выполнить с этими ресурсами (в любом формате, который вы хотите поддерживать). Это полезно для быстрых операций, когда код ответа на запрос может указывать на результат операции.Все может быть достигнуто при сохранении ограничений REST, и обычно ответ состоит в том, чтобы превратить «проблему» в ресурс и дать ему URL.
Таким образом, пакетные операции, такие как удаление здесь, или отправка нескольких элементов в список, или внесение того же изменения в ряд ресурсов, могут выполняться путем создания списка «пакетных операций» и отправки в него новой операции.
Не забывайте, что REST - не единственный способ решить любую проблему. «ОТДЫХ» - это просто архитектурный стиль, и вам не обязательно его придерживаться (но вы теряете определенные преимущества Интернета, если вы этого не сделаете). Я предлагаю вам просмотреть этот список архитектур HTTP API и выбрать ту, которая вам подходит. Просто осознайте, что вы потеряете, если выберете другую архитектуру, и примите обоснованное решение на основе вашего варианта использования.
Есть несколько плохих ответов на этот вопрос о шаблонах для обработки пакетных операций в веб-службах REST? которые имеют слишком много голосов, но их тоже стоит прочитать.
источник
DELETE
отправите запрос, все, что находится между запрашиваемым и сервером, будет думать, что один ресурс по указанному URL-адресу удаляется. Строки запроса являются непрозрачными частями URL-адреса для этих устройств, поэтому не имеет значения, как вы указываете свой API, они не посвящены этим знаниям, поэтому не могут вести себя иначе.DELETE
запросом запрещена. Не делай этого. Если вы это сделаете, я съем ваших детей. Ням ням ням.Если
GET /records?filteringCriteria
возвращает массив всех записей, соответствующих критериям, тоDELETE /records?filteringCriteria
может удалить все такие записи.В этом случае ответ на ваш вопрос будет
DELETE /records?id=1&id=2&id=3
.источник
GET /records?id=1&id=2&id=3
вовсе не означает , «получить три записи с идентификаторами 1, 2 и 3», это означает «получить один ресурс с URL путем / записями? ID = 1 & ID = 2 & ID = 3» , который может быть картиной репы, простой текст документ, содержащий число «42» на китайском языке, или может не существовать./records?id=1
и/records?id=2
, а их ответы кэшируются некоторым посредником (например, вашим браузером или интернет-провайдером). Если бы Интернет знал, что ваше приложение имеет в виду под этим, то логично предположить, что запрос/records?id=1&id=2
может быть возвращен кешем просто путем слияния (каким-то образом) двух результатов, которые у него уже есть, без необходимости запрашивать исходный сервер. Но это невозможно./records?id=1&id=2
может быть недействительным (разрешен только 1 идентификатор на запрос) или может возвращать что-то совершенно другое (репу).id[]=1&id[]=2
илиid=1&id=2
в строке запроса для представления массива значений, эта строка запроса представляет именно это. И я думаю, что это очень распространенная и хорошая практика, когда строка запроса представляет собой фильтр. Кроме того, если вы разрешаете удаление и обновление, не кэшируйтеGET
запросы. Если вы это сделаете, клиенты будут иметь устаревшее состояние.Я думаю, что Mozilla Storage Service SyncStorage API v1.5 - хороший способ удалить несколько записей с помощью REST.
Удаляет всю коллекцию.
DELETE https://<endpoint-url>/storage/<collection>
Удаляет несколько BSO из коллекции одним запросом.
DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>
ids : удаляет BSO из коллекции, чьи идентификаторы находятся в предоставленном списке, разделенном запятыми. Может быть предоставлено не более 100 идентификаторов.
Удаляет BSO в указанном месте.
DELETE https://<endpoint-url>/storage/<collection>/<id>
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
источник
Да, до сих пор я встречал только одно руководство по проектированию REST API, в котором упоминаются пакетные операции (например, пакетное удаление): руководство по дизайну API Google .
В этом руководстве упоминается создание «пользовательских» методов, которые могут быть связаны через ресурс с помощью двоеточия, например
https://service.name/v1/some/resource/name:customVerb
, в нем также явно упоминаются пакетные операции как вариант использования:Итак, вы можете сделать следующее в соответствии с руководством Google по API:
... чтобы удалить кучу элементов из вашего коллекционного ресурса.
источник
If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,
в главе Custom Method. НоGET accounts.locations.batchGet
api - это метод GET с телом. Это странно. developers.google.com/my-business/reference/rest/v4/…POST
http-метод, и назван только пользовательский методbatchGet
. Я предполагаю, что Google делает это, чтобы (а) придерживаться своего правила, согласно которому все пользовательские методы должны бытьPOST
(см. Мой ответ) и (б), чтобы людям было проще помещать «фильтр» в тело, чтобы вам не приходилось экранировать или закодировать фильтр, как со строками запроса. Обратной стороной, конечно же, является то, что это больше не кэшируется ...https://service.name/v1/some/resource/name:customVerb
не является RESTful по определению.Я допустил оптовую замену коллекции, например,
PUT ~/people/123/shoes
когда тело является полным представлением коллекции.Это работает для небольших дочерних коллекций элементов, где клиент хочет просмотреть элементы и удалить некоторые из них и добавить другие, а затем обновить сервер. Они могли ПОСТАВИТЬ пустую коллекцию, чтобы удалить все.
Это будет означать,
GET ~/people/123/shoes/9
что он все равно останется в кеше, даже если PUT удалил его, но это просто проблема кеширования, и это будет проблемой, если какой-то другой человек удалит обувь.Мои API данных / систем всегда используют ETags, а не время истечения срока действия, поэтому сервер обрабатывается при каждом запросе, и мне требуются правильные заголовки версии / параллелизма для изменения данных. Для API, которые доступны только для чтения и выровнены по просмотру / отчету, я использую время истечения срока действия, чтобы уменьшить количество обращений к источнику, например, таблица лидеров может работать в течение 10 минут.
Для гораздо больших коллекций, например
~/people
, мне не нужно многократное удаление, вариант использования обычно не возникает естественным образом, и поэтому одиночное DELETE работает нормально.В будущем, исходя из опыта создания REST API и решения тех же проблем и требований, как аудит, я был бы склонен использовать только глаголы GET и POST и проектировать вокруг событий, например, POST для события смены адреса, хотя я подозреваю, что приеду со своим набором проблем :)
Я также позволил бы интерфейсным разработчикам создавать свои собственные API-интерфейсы, которые потребляют более строгие серверные API-интерфейсы, поскольку на стороне клиента часто есть практические и веские причины, по которым им не нравятся строгие конструкции REST API "Fielding zealot", а также для повышения производительности и Причины расслоения кеша.
источник