У меня есть коллекция продуктов в группе продуктов, например:
product-groups/123/products
Если мне нужно добавить в коллекцию, это нормально, что я пропускаю только некоторые продукты с PUT?
Если мне нужно удалить некоторые товары из коллекции, можно ли передать данные фильтра (массив идентификаторов) с помощью команды DELETE?
Какой лучший способ реализовать функциональность в духе ReST?
Изменить: элементы являются ссылками на отдельные объекты, в основном идентификаторы продуктов.
rest
collections
user151851
источник
источник
Ответы:
В общем, у вас есть одна конечная точка, которая представляет всю коллекцию x :
Скажем, вы хотите обновить один продукт, вы делаете PUT для
/products/{id}
. Если вы хотите частично обновить отдельный продукт (не обновляя каждое поле), вы также можете использовать PATCH для/products/{id}
. То же самое касается удаления одного объекта ( УДАЛИТЬ в/products/{id}
).Если вы хотите настроить таргетинг на одного Ressource, вы имеете право по пути, который сингл Ressource, вы хотите изменить.
Единственное действие, которое нарушает схему, - это создание ресурса. При создании ресурса вы нацеливаетесь на коллекцию в целом, говорите POST для
/products
.Тем не менее, должно быть ясно, что цель для операций, влияющих на коллекцию в целом, должна идти к соответствующей конечной точке коллекции.
Например, вы хотите получить подмножество продуктов красного цвета, вы запрашиваете его
GET к
/products?colour=red
.Итак, если вы хотите удалить все это, вы УДАЛИТЕ
/products?colour=red
. Или , если вы хотите удалить некоторые из продуктов черезid
, можно УДАЛИТЬ/products?id=1&id=2&id=3
.Как насчет массового создания ресурсов? Разместите свою коллекцию
[{...},{...},{...}]
просто в/products
. То же самое касается PUT и PATCH .Это действительно просто.
Чтобы ответить на ваши вопросы:
Это не только хорошо, вам рекомендуется делать это так.
Это нормально. Как писал Энеко Алонсо, иногда бывают булкооперации, инкапсулированные через «контроллеры», то есть POST используется для запуска (сложных) операций.
источник
PATCH
и полная замена черезPUT
.Обычно методы REST предназначены для работы с одним объектом / объектом (CRUD).
Есть несколько вариантов:
Первый соответствует стандартам REST, но может быть дорогостоящим, так как ваши объекты / объекты коллекции могут быть очень большими (обновление группы, состоящей из тысяч продуктов только для добавления / удаления одного продукта, было бы тяжелым запросом).
Второй вариант предпочтителен многими API как способ расширить REST за пределы операций CRUD.
Например:
Многие API всегда используют POST для этих расширенных операций, но ничто не ограничивает вас в использовании других методов http (кроме ограничения GET и DELETE, чтобы иметь пустое тело)
источник
products/collection
возвращало «конверт» предметов и содержимое конверта, измененное через PUT? Например, «вот как я хочу, чтобы элементы в коллекции были».Просто чтобы уточнить предыдущие ответы / комментарии.
Насколько мне известно, POST является методом добавления отдельных элементов в коллекцию.
DELETE, в свою очередь, это метод удаления отдельного элемента из коллекции. Оба сценария отлично подходят.
Однако вы должны использовать соответствующий URI для ссылки на отдельный элемент или всю коллекцию.
Например, чтобы добавить элемент в коллекцию, вы должны отправить данные в следующий URI:
Чтобы удалить один продукт из коллекции, вы можете использовать метод DELETE, отправляющий запрос на что-то вроде:
Метод PATCH можно использовать для обновления некоторых элементов в коллекции. Например, когда вам нужно обновить только одно поле в одном элементе. Оформление полного представления ресурса для очень большой коллекции может быть очень дорогостоящей операцией.
источник
В принципе, все операции RESTful допустимы в коллекции, но убедитесь, что вы понимаете, как семантика глаголов применяется к коллекции:
PUT - полная замена.
/item/{id}
) и пропускаетеname
его, его следует очистить или установить на ноль или что-то подобное.Хотя PUT может использоваться для добавления предметов, вы должны отправить «все» предметы. Отправка «некоторых» предметов должна привести к удалению (я полагаю, что это не то, чего желает ОП).
DELETE более интуитивно понятен. Допустимо удалить коллекцию или любое отфильтрованное подмножество. Только элементы, включенные в фильтр, должны быть затронуты.
PATCH также действителен. Теоретически, вы должны предоставить список «операций». Например, технически вы должны отправить что-то вроде:
На практике чаще встречается API, который принимает частичный список объектов, каждый элемент которого обрабатывается с использованием логики UPSERT (обновление или вставка).
Технически, POST должен обрабатывать ввод «в соответствии с собственной специфической семантикой ресурса».
{resource}/activate
.ПРИМЕЧАНИЕ. При использовании операций не-GET для коллекций тщательно продумайте определение успеха и неудачи. ОТДЫХ не дает хорошего способа сообщить о частичном успехе. Хорошим значением по умолчанию является допущение, что вы будете запускать операцию в транзакции с критерием успеха "все или ничего". Если это не то, что вам нужно, вы, вероятно, не должны напрямую взаимодействовать с коллекцией.
источник