Важно понимать, что методы HTTP работают в области «передачи документов по сети», а не в вашем собственном пользовательском домене.
Ваша модель ресурсов - это не модель вашего домена, а не ваши данныемодель.
Альтернативное написание: REST API - это фасад, который делает ваш домен похожим на веб-сайт .
За фасадом реализация может делать то, что ей нравится.с учетом того, что если реализация не соответствует семантике, описанной в сообщениях, то она (а не клиент) несет ответственность за любой ущерб, вызванный несоответствием.
DELETE /path/abc?itemId=1&itemId=2&itemId=3
Так что HTTPВ запросе говорится конкретно: «Применить семантику удаления к документу, описанному /path/abc?itemId=1&itemId=2&itemId=3
».Тот факт, что этот документ представляет собой совокупность трех различных элементов в вашем магазине длительного пользования, каждый из которых должен быть удален независимо, является деталями реализации.Часть пункта REST заключается в том, что клиенты изолированы именно от такого рода знаний.
Однако, и я чувствую, что именно здесь теряются многие люди, метаданные, возвращаемые ответомна этот запрос на удаление клиент ничего не сообщает о ресурсах с разными идентификаторами.
Что касается клиента, /path/abc
является отличным идентификатором от /path/abc?itemId=1&itemId=2&itemId=3
.Так что, если клиент сделал GET из / path / abc и получил представление, которое включает в себя itemIds 1, 2, 3;и затем отправляет удаление, которое вы описываете, оно все равно будет иметь в своем собственном кэше представление, включающее /path/abc
после успешного удаления.
Это может или не может быть тем, что вы хотите.Если вы выполняете REST (через HTTP), это то, о чем вы должны думать в своем дизайне.
POST /path/abc
some-useful-payload
Этот метод сообщает клиенту, что мы делаем некоторые (возможно, небезопасные) изменения в/path/abc
, и в случае успеха предыдущее представление должно быть признано недействительным.Клиент должен повторить свой более ранний запрос GET /path/abc
, чтобы обновить свое предыдущее представление, а не использовать ранее недействительную копию.
Но, как и раньше, это не влияет на кэшированные копии других ресурсов
/path/abc/1
/path/abc/2
/path/abc/3
Все они все еще будут храниться в кеше, даже если они были "удалены".
Если быть полностью справедливым, многим людям все равно потому что они не думают о клиентах, кэширующих данные, которые они получают с веб-сервера.И вы можете добавить метаданные к ответам, отправляемым веб-сервером, чтобы сообщить клиенту (и промежуточным компонентам), что представления не поддерживают кэширование или что результаты могут кэшироваться, но их необходимо повторять при каждом использовании.
Опять же: Ваша модель ресурсов - это не модель вашего домена, а не ваша модель данных.REST API - это другой способ осмысления происходящего, а архитектурный стиль REST настроен для решения конкретной проблемы и поэтому может не подходить для более простой задачи, которую вы пытаетесь решить.
Это не значит, что я думаю, что каждый должен проектировать свои собственные системы в соответствии с архитектурным стилем REST.REST предназначен для долгоживущих сетевых приложений, которые охватывают несколько организаций.Если вы не видите необходимости в ограничениях, не используйте их.Это нормально для меня, если вы не называете результат REST API.У меня нет проблем с системами, которые соответствуют их собственному архитектурному стилю.- Филдинг, 2008