Правило 1. REST касается объектов.Не методы.
REST-ресурсы слишком фрагментированы
False.Всегда ложно.Ресурсы REST независимы.Они не могут быть «слишком» фрагментированными.
вместо того, чтобы иметь только ресурс устройства, у меня теперь есть все эти ресурсы:
Device DeviceStatus Driver DriverStatus
Покавсе это имеет смысл с точки зрения [RESTful], нормально ли иметь много подресурсов, каждый из которых отображается в отдельный класс python?
На самом деле, они не имеют смысла.Отсюда твой вопрос.
Устройство это вещь./ rest / environment / {id} / devices / {deviceId}
Имеет статус.Вам следует рассмотреть возможность предоставления статуса и информации об устройстве вместе в виде одного составного документа, описывающего устройство.
То, что ваша реляционная база данных нормализована, не означает, что ваши объекты RESTful должны быть точно такими же нормализованными, как и ваша база данных.Хотя это проще (а многие фреймворки делают это очень и очень просто), это может быть не значимым .
считать соединение существующим всегда, поэтому использование«PUT», но разве это плохо, учитывая, что «PUT» должен быть идемпотентным?
Соединения не всегда существуют.Они могут приходить и уходить.
Хотя реляционная база данных может иметь таблицу ассоциаций «многие ко многим», которую вы можете ОБНОВИТЬ, это особый особый случай, который на самом деле не имеет особого смысла вне мира администраторов баз данных.
Связь между двумя объектами RESTful редко бывает отдельной.Это атрибут каждой из вещей RESTful.
Совершенно непонятно, что это за «связь».Вы смутно говорите об этом, но не предоставляете никаких подробностей.
Не имея каких-либо полезных фактов, я предполагаю, что вы подключаете устройства к драйверам, и есть какие-то [Device]<-[Driver Status]->[Driver
] отношения.Соединение между устройством и драйвером может быть отдельным ресурсом RESTful.
Это также может быть атрибут устройства или драйвера, который на самом деле не имеет отдельного видимого ресурса RESTful.
[Снова.Некоторые фреймворки, такие как Django-Piston, упрощают раскрытие базовых классов.Однако это может быть не всегда уместно.]
Существуют ли хорошие правила / советы для интеллектуального определения набора ресурсов из набора методов?
Да.Не делай этого.Ресурсы не являются методами.В значительной степени это так.
Если у вас много методов - вне CRUD - тогда у вас может быть проблема с моделью данных.У вас может быть слишком мало классов вещей, выраженных в вашей реляционной модели, и слишком много состояний обновлений вещей.
Состоящие объекты не являются изначально злыми, но их необходимо критически исследовать.В некоторых случаях PUT для изменения статуса объекта, возможно, должен был быть POST для добавления в историю объекта.«Текущее» состояние - это последнее, что отправлено.
Также.
Вам не нужно тривиализировать каждый ресурс как класс вещей.Вы можете иметь ресурсы, которые являются коллекциями.Вы можете поместить довольно сложный документ в составной (по сути Facade ) «ресурс».Этот сложный документ может подразумевать несколько операций CRUD в базе данных.
Вы уходите от простого RESTful.Ваш вопрос остается намеренно темным.«Ядро приложения, богатое методами» не имеет большого значения.Без конкретных примеров это невозможно представить.
Логика API, влияющая на структуру приложения
Если они чем-то отличаются, вы, вероятно, создаете ненужную, бесполезную сложность.
Является ли хорошей практикой применение разделения интересов?
Всегда.Зачем спрашивать?
большая часть этого, кажется, происходит из-за моей путаницы в том, как сопоставить довольно богатый метод api с Rest-Full, где ресурсы должны быть существительными, а не глаголами: так, когда разумно считать элемент отдыхом? "ресурс "?
Ресурс определяется вашей проблемной областью.Обычно это что-то материальное.Методы (как в «API-интерфейсе с богатыми методами», как правило, не имеют значения. Это операции CRUD (создание, получение, обновление, удаление). Если у вас есть что-то, что по сути не является CRUD, вам нужно ОСТАНОВИТЬ кодирование. ОСТАНОВИТЬ написание кода иПереосмыслите API, чтобы сделать его похожим на CRUD.
CRUD - Create-Retrieve-Update-Delete сопоставляет с PEST-GET-PUT-DELETE REST. Если вы не можете преобразовать проблемный домен в эти термины, остановитеськодирование. Прекратите кодирование, пока не доберетесь до правил CRUD.
Мне нужно иметь возможность отображать список доступных типов драйверов (т.е. имена классов, а не экземпляр драйвера) в клиенте: это будет означать созданиееще один ресурс, такой как "DriverTypes"?
Правильно. Они уже являются частью вашего проблемного домена. У вас уже определен этот класс. Вы просто делаете его доступным через REST.
Вот в чем дело. Проблемная область имеет объекты реального мира. У вас есть определения классов. Это материальные вещи. REST передает состояние этих материальных вещей.
Ваше программное обеспечение может содержать нематериальные вещи, такие как «ассоциации» или «ссылки» или «соединения», другие нежелательные элементы, являющиеся частью программного решения.Этот мусор не имеет большого значения.Это детали реализации.Не реальные вещи.
«Ассоциация» всегда видна из обоих реальных ресурсов RESTful.Один ресурс может иметь ссылку, подобную внешнему ключу, которая позволяет клиенту выполнять RESTful-выборку другого связанного объекта.Или ресурс может иметь коллекцию других связанных объектов, и один GET получает объект и коллекцию связанных объектов.
В любом случае, реальные ресурсы RESTful - это то, что доступно.Отношения просто подразумеваются.Даже если это физическая таблица базы данных «многие ко многим» - это не значит, что должно быть открыто.[Снова.Некоторые фреймворки позволяют легко разоблачить все.Это не всегда хорошо.]