Я пытаюсь обернуть голову тем, как создать RESTful API для создания графов объектов. Так, например, думать о электронной коммерции API, где ресурсы имеют следующие соотношения:RESTfully создание графов объектов
Order (основной объект)
- HAS-много адресов
- HAS-много Order Line элементов (то, что делает порядок состоит из)
- Has-многие платежи
- Has-много Контактная информация
Ресурс Order обычно имеет смысл наряду с его ассоциациями. В изоляции это просто тупой контейнер, не имеющий делового значения. Тем не менее, каждый из связанных объектов имеет свою собственную жизнь и может нуждаться в манипулировании независимо, например. редактирование адрес доставки заказа, изменение контактной информации в отношении порядка, удаление постатейного от порядка после он был помещен и т.д.
Есть два варианта проектирования API:
- Порядок API конечных точек разумно создает себя и связанные с ним ресурсы путем обработки «вложенную ресурс» в содержании отправленного в
POST /orders
- ресурс заказа только создает себя, и клиент должен сделать последующие запросы POST для вновь созданных конечных точек , например
POST /orders/123/addresses
,PUT /orders/123/line-items/987
, e tc.
Хотя второй вариант проще реализовать на стороне сервера, он заставляет клиента выполнять дополнительную работу в 80% случаев использования.
Первый вариант имеет следующие открытые вопросы:
- Как один URL-адрес общения для вновь созданного ресурса? Заголовок
Location
может связывать только один URL-адрес, однако сервер потенциально мог бы создать несколько ресурсов. - Как бороться с ошибками? Что делать, если одна из ассоциаций имеет ошибку? Отбрасываем ли мы весь граф объектов? Как эта ошибка передается клиенту?
Что такое RESTful + прагматичный способ борьбы с этим?
«Как правило, имеет смысл» означает, что заказ * может существовать без других ресурсов или нет? Были ли ресурсы в недопустимом состоянии между двумя шагами варианта 2? – 2013-03-11 07:39:10
В 80% случаев данные для ассоциаций будут доступны во время создания заказа. Тем не менее, в 20% случаев мы * можем * хотеть сохранить частичный объект в БД, который будет обновляться и обрабатываться на более позднем этапе. Например, мы можем пропустить информацию о платеже и добавить ее позже. –