В настоящее время я разрабатываю API для существующего приложения PHP и с этой целью исследую REST как разумный архитектурный подход.
Я считаю, что у меня есть разумное представление об основных концепциях, но я изо всех сил пытаюсь найти кого-нибудь, кто занимался бы иерархиями объектов и REST.
Вот в чем проблема ...
В иерархии бизнес-объектов [приложение] мы имеем:
Users
L which have one-to-many Channel objects
L which have one-to-many Member objects
В самом приложении мы используем подход с отложенной загрузкой, чтобы заполнить объект User массивами этих объектов по мере необходимости. Я верю в объектно-ориентированные термины, это агрегация объектов, но я видел различные несоответствия в именовании и не хочу начинать войну из-за точного соглашения об именах ‹/ flame war›.
А пока подумайте, что у меня есть несколько слабосвязанных объектов, которые я могу или не могу заполнять в зависимости от потребности приложения.
С точки зрения REST я пытаюсь выяснить, каким должен быть подход. Вот мое текущее мышление (учитывая только GET на данный момент):
Вариант 1 - полностью заполнить объекты:
GET api.example.com/user/{user_id}
Прочтите объект (ресурс) User и верните объект User со всеми возможными объектами Channel и Member, предварительно загруженными и закодированными (JSON или XML).
ПЛЮСЫ: уменьшает количество объектов, обход иерархии объектов не требуется.
МИНУСЫ: объекты должны быть полностью заполнены (дорого)
Вариант 2 - заполните основной объект и включите ссылки на другие ресурсы объекта:
GET api.example.com/user/{user_id}
Прочтите объект (ресурс) пользователя и верните заполненные данные пользователя объекта пользователя и два списка.
Каждый список ссылается на соответствующий (под) ресурс, т.е.
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
вызов / channels вернет список ресурсов канала в форме (как указано выше):
api.example.com/channel/{channel_id}
ПЛЮСЫ: первичные ресурсы показывают, куда идти, чтобы получить подчиненных, но не то, что они есть (более RESTful?), Нет необходимости получать подчиненных заранее, генераторы подчиненных списков (/ каналы и / члены) предоставляют интерфейсы (например, метод) создание ответ больше службы нравится.
МИНУСЫ: теперь требуется три вызова для полного заполнения объекта
Вариант 4 - (пере) рассмотреть дизайн объекта для REST
Я повторно использую [существующую] иерархию объектов приложения и пытаюсь применить ее к REST - или, возможно, более напрямую, предоставить ей интерфейс API.
Возможно, иерархия объектов REST должна быть другой, или, возможно, новое мышление RESTful обнажает ограничения существующего дизайна объектов.
Любые мысли по вышеизложенному приветствуются.