В настоящее время я разрабатываю API для существующего приложения PHP, и с этой целью изучаю REST как разумный архитектурный подход.
Я полагаю, что у меня есть достаточное понимание ключевых понятий, но я изо всех сил пытаюсь найти кого-нибудь, кто занимался иерархиями объектов и REST.
Вот в чем проблема ...
В иерархии бизнес-объектов [application] мы имеем:
Users
L which have one-to-many Channel objects
L which have one-to-many Member objects
В самом приложении мы используем подход с отложенной загрузкой, чтобы заполнить объект User массивами этих объектов по мере необходимости. Я считаю, что в терминах ОО это агрегация объектов, но я видел различные несоответствия именования и не хочу начинать войну за точное соглашение об именах.
А пока, подумайте, у меня есть несколько слабо связанных объектов, которые я могу / не могу заполнять в зависимости от потребностей приложения.
С точки зрения REST, я пытаюсь выяснить, каким должен быть подход. Вот мое текущее мышление (учитывая GET только на данный момент):
Вариант 1 - заполнить объекты полностью:
GET api.example.com/user/{user_id}
Считайте объект User (ресурс) и верните объект User со всеми возможными объектами Channel и Member, предварительно загруженными и закодированными (JSON или XML).
PROS: уменьшить количество объектов, обход иерархий объектов не требуется
Минусы: объекты должны быть полностью заселены (дорого)
Вариант 2 - заполнить первичный объект и включить ссылки на другие ресурсы объекта:
GET api.example.com/user/{user_id}
Считать объект User (ресурс) и вернуть объект User. Заполненные данные пользователя и два списка.
Каждый список ссылается на соответствующий (под) ресурс, т.е.
api.example.com/channel/{channel_id}
api.example.com/member/{member_id}
Я думаю, что это близко (или точно) к последствиям гипермедиа - клиент может получить другие ресурсы, если захочет (при условии, что я их разумно помечаю).
PROS: клиент может выбрать загрузку подчиненных или иным способом, лучше разделить объекты как ресурсы REST
Минусы: для получения дополнительных ресурсов требуется дополнительная поездка
Вариант 3 - включить рекурсивное извлечение
GET api.example.com/user/{user_id}
Чтение объекта User и включение ссылок на списки подобъектов, т.е.
api.example.com/user/{user_id}/channels
api.example.com/user/{user_id}/members
вызов / channel вернет список ресурсов канала в форме (как указано выше):
api.example.com/channel/{channel_id}
PROS: первичные ресурсы раскрывают, куда идти, чтобы получить субодинаты, но не то, что они есть (более RESTful?), Нет необходимости получать подчиненные заранее, генераторы списка подчиненных (/ channel и / members) предоставляют интерфейсы (метод как) сделать ответ более услугу вроде.
Минусы: теперь для полного заполнения объекта требуется три вызова
Вариант 4 - (пере) рассмотреть проектирование объекта для REST
Я повторно использую [существующую] иерархию объектов приложения и пытаюсь применить ее к REST - или, возможно, более напрямую, предоставить API-интерфейс для нее.
Возможно, иерархия объектов REST должна быть другой, или, возможно, новое мышление RESTful выявляет ограничения существующего дизайна объектов.
Любые мысли по поводу вышеизложенного приветствуются.
Большое спасибо
Пол