Создайте плоскую вселенную, которую вы выставляете миру.
Даже когда я использую SOAP, который может легко обрабатывать иерархические графы объектов до любой глубины, я выравниваю график и связываю все с помощью простых идентификаторов (вы даже можете использовать идентификаторы базы данных, хотя идея заключается в том, что вы хотите, чтобы вы не не хочу показывать свои ПК миру).
Ваша объектная вселенная внутри вашего приложения не обязательно является той же, которую вы представляете миру. Пусть у A есть дочерние элементы, а у B - дочерние, но нет необходимости отражать это в URL-адресах запросов REST.
Зачем расплющивать? Потому что тогда вы можете делать такие вещи, как выборка объектов позже по идентификатору, или отправлять их пакетами (в одном и том же случае, более или менее) ... И, что лучше всего, URI запроса не изменяются при изменении иерархии объектов (объект 37252 всегда один и тот же, даже если он был переклассифицирован).
Редактировать: Ну, вы просили об этом ... Вот архитектура, которую я использовал в конечном итоге:
package: server - содержит суперклассы, которые совместно используются внешним сервером и внутренним сервером
package: frontEndServer - содержит интерфейс сервера, которого должен придерживаться интерфейсный сервер. Интерфейс хорош, потому что если вы решите перейти с SOAP на прямой веб-клиент (который также использует JSON или что-то еще), вы получите интерфейс полностью продуманным. Он также содержит все реализации для классов frontEnd, которые будут брошены клиенту, и всю логику взаимодействия между классами, за исключением того, как разговаривать с клиентом .
package: backEndServer - содержит интерфейс сервера, которого будет придерживаться внутренний сервер. Примером реализации Сервера может быть тот, который общается с БД MySql или тот, который общается с БД XML, но интерфейс Сервера нейтрален. Этот пакет также содержит все классы, которые реализации интерфейса сервера используют для выполнения работы, и всю логику для бэкэнда, кроме персистентности.
тогда у вас есть пакеты реализации для каждого из них ... которые включают в себя такие вещи, как сохранение в бэкэнде и взаимодействие с клиентом для внешнего интерфейса. Пакет реализации front-end может знать, например, что пользователь вошел в систему, тогда как frontEndServer просто знает, что ему нужно реализовать методы для создания пользователей и входа в систему.
После того, как я начал это писать, я понимаю, что потребуется больше времени, чтобы описать все, но здесь у вас есть суть.