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