несколько баллов;
Домен интерфейса службы! = Домен реализации
Ресурсы, предоставляемые вашей службой, не обязательно должны быть напрямую реализованы как объекты в вашем коде.Интерфейс (службы) не является реализацией.
Для Put & Post требуется все внешнее состояние
При выполнении необходимо указать все состояние ресурса.ваши обновления (вы сказали, что вы предоставляете только изменения - это PATCH, а не PUT).
Моделирование изменений состояния с помощью ресурсов коллекции
Иногда лучшесмоделировать изменение состояния как ресурс коллекции.В вашем примере вам действительно нужно рассмотреть ресурс «Просмотр» со связанной «Очередью обзора» или , чтобы добавить атрибут «Требуется проверка» в виджет.
Подход 1. Контейнер для «очереди просмотра»
Наличие объекта «Просмотр» позволит легко перечислять виджеты для просмотра, назначать ресурсы для просмотраetc
GET / review-queue - для получения списка виджетов, которые необходимо просмотреть
POST / review-queue - создание новой записи обзора (с указанием только идентификатора, имени виджета иURL-адрес обратно к виджетам)
DELETE / review-queue / X - удалить из очереди, когда виджет был просмотрен
Я бы использовал этот подход, если бы существенное поведение было связанос «очередью просмотра», например, разрешениями, связанными с добавлением виджета для просмотра, несколькими очередями просмотра и т. д.
подход 2. Атрибут «Требуется проверка»
Вы можете решить, что отдельный ресурс слишком важен для ваших нужд.Вы можете смоделировать базовую функциональность с помощью POST, PUT и GET.
Когда виджет создан, его состояние включается в качестве атрибута 'needs-review', для которого установлено значение False.Очевидно, вам нужно все внешнее состояние в POST
Когда виджет нуждается в проверке, ПОЛУЧИТЕ его и ВЕРНУТЬ его обратно с обновленным «потребностей-обзором».Опять же, вам нужно все внешнее состояние в PUT
. При отображении виджетов для просмотра используйте
GET / widgets /? Needs_review = true
Бедный старый RPC
Вы упомянули RPC в своем последнем абзаце и, хотя это не по теме, я не могу не комментировать ...
Я думаю, что, возможно, мы все виноваты в том, что обвиняем RPC во всех бедах мира.Реальная проблема с RPC состоит в том, что он нацелен на то, чтобы сделать удаленные вызовы функций прозрачными для программиста, скрывая сценарии сбоев и пытаясь сделать удаленный вызов эквивалентным на языке реализации в качестве стандартного вызова функции.Как старый программист CORBA (который страдал от той же проблемы), я могу оценить, как REST исправляет эту ошибку.
Другие моменты из вашего поста
Вы не можете определить, какой метод вызывать, не изучив новое состояние и не сравнив его с существующим состоянием.
Вы должны проверить новое состояние, прежде чем делать что-либо еще, передавая любые ошибки обратно отправителю.
Из вашего последнего абзаца, я думаю, вы уже это знаете - извините.
Chris