Важно понимать, что методы 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 и получил представление, включающее itemId 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 г.
person
VoiceOfUnreason
schedule
04.04.2019
GET /path/abc?itemId=1
может по-прежнему обслуживаться кешем, а не фактическим сервером, даже если фактический ресурс уже может быть удален в пакетном режиме. - person Roman Vottner   schedule 04.04.2019POST /path/to/collections
, тогда как извлечение определенного элемента происходит черезGET path/to/collections/item
, который является ключом, отличным от того, который вы использовали для хранения новых элементов. Обновление или удаление этого конкретного элемента приведет к аннулированию кеша, однако OOTB. - person Roman Vottner   schedule 04.04.2019