Я думаю, вы должны перестать думать о ресурсах как об синонимах для объектов базы данных. Да, они часто связаны, но ресурс - это просто адресуемая концепция в вашем домене. Я думаю, что гораздо полезнее думать о ресурсах как о вещах, которые вы видите в Интернете, когда используете браузер (списки, элементы, сообщения, комментарии, изображения и т. Д.).
Но как бы вы выполнили команду "очистить все"?
Я не уверен, почему DELETE / products / milk подразумевает удаление самой категории молока, но если вы предпочитаете:
DELETE /products?category=milk
УДАЛЕНИЕ не подразумевает удаление одного объекта базы данных. Это подразумевает удаление одного ресурса. И "/ products? Category = milk" (или "/ products / milk", в этом отношении) идентифицирует единственный ресурс. Если вы можете получить его, вы можете удалить его.
А что, если вы хотите выполнить оба?
Как насчет этого?
DELETE /product-categories/milk
Одна из хитростей, которая стала популярной в Ruby on Rails, - предоставить форму (используя GET) для любой операции PUT / POST / DELETE. Таким образом, для этих удалений вы можете предоставить следующую форму:
GET /product-categories/milk/delete
В этой форме (например, HTML) вы могли бы спросить своего пользователя, действительно ли можно удалить всю категорию. (Пожалуйста, не обращайте внимания на то, что формы HTML на самом деле не совместимы с веб-сервисами RESTful. HTML это довольно успешный формат для взаимодействия с ресурсами в Интернете, и хорошо спроектированное AJAX-приложение, вероятно, сначала работает как хорошо спроектированное HTML-приложение. Есть некоторые детали, которые необходимо проработать для поддержки как браузеров, так и других ваших клиентов, но все они законные клиенты REST.)
Как отключить сайт?
Есть много способов сделать это. Может работать только PUT на /sites/stackoverflow.com с флагом отключения.
Наконец, как вы согласовываете HTML-формы с RESTful?
Вы действительно не можете сделать HTTP PUT или DELETE из браузера, но вы можете предоставить скрытое поле в вашей форме, чтобы подделать его:
<input type="hidden" name="_method" value="PUT" />
Пока ваш механизм маршрутизации поддерживает это, это хороший способ направить сообщение браузера в соответствующий обработчик (я также видел, как люди используют заголовок X-HTTP-Method-Override для клиентов, не являющихся HTML, без полного поддержка HTTP-глаголов).
Если вы заинтересованы в поиске, я рекомендую Web Services Cookbook для начинающих. Также взгляните на модель зрелости Ричардсона 1042 *. И помните, что REST похож на остальную часть Интернета. Это было бы не очень полезно без ссылок. Предоставьте своим клиентам способ обойти.
<a href="/products/milk/delete" rel="delete" />
<atom:link href="/products/milk/delete" rel="delete" />