Как я должен иметь дело с иерархиями объектов в RESTful API?

В настоящее время я разрабатываю 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).

ПРОФИ: уменьшить количество объектов, не требуется обход иерархий объектов
Минусы: объекты должны быть полностью заселены (дорого)

Вариант 2 - заполнить первичный объект и включить ссылки на другие ресурсы объекта:

GET api.example.com/user/{user_id}

Прочитайте объект User (ресурс) и верните объект User заполненные данные пользователя и два списка.

Каждый список ссылается на соответствующий (под) ресурс, т.е.

api.example.com/channel/{channel_id}
api.example.com/member/{member_id}

Я думаю, что это близко (или точно) к последствиям гипермедиа - клиент может получить другие ресурсы, если захочет (при условии, что я размечу их разумно).

ПРОФИ: клиент может выбрать загрузку подчиненных или иным образом, лучшее разделение объектов как ресурсов 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?), Нет необходимости получать подчиненные заранее, генераторы списка подчиненных (/ каналы и / члены) предоставляют интерфейсы (метод, подобный), создающий ответ больше сервис нравится.
Минусы: теперь нужно три вызова для полного заполнения объекта

Вариант 4 - (повторно) рассмотреть проектирование объекта для REST

Я повторно использую [существующую] иерархию объектов приложения и пытаюсь применить ее к REST - или, возможно, более напрямую, предоставить интерфейс API к ней.

Возможно, иерархия объектов REST должна быть другой, или, возможно, новое мышление RESTful выявляет ограничения существующего дизайна объектов.

Любые мысли по поводу вышеизложенного приветствуются.

Большое спасибо

Павел

Ответы на вопрос(4)

Ваш ответ на вопрос