Как моделировать сущности родителей-ребенка через отдых и jax-rs
Вопрос
Я работаю над API на основе отдыха и испытываю некоторые проблемы с выяснением канонического способа представлять отношения между родителями и ребенком. (Я пишу бобы в CXF и использую JAX-RS и JAXB. Я начал с основного примера, предоставленного CXF)
Моя проблема в том, что у вас есть Foo и бар. Существует 1-N отношения с Foo и Bar, то есть в 1 Foo много баров. У меня вопрос, каков канонический способ узнать, какие бары есть у Foo? И какой канонический способ получить доступ к ресурсам, принадлежащим Foo?
Я понял, что, например, я мог бы перечислить Foos по адресу:
ПОЛУЧИТЬ http: // xxx/fooservice/foos
И работайте на одном Foo на:
Положить/обновить/удалить http: // xxx/fooservice/foo/{fooid}
Но как мне перечислить бары, которые есть у Foo 121? И как мне получить доступ к ним? Я заметил, что кажется, что Jaxb Marshaller не выводит коллекции, просто атрибуты для бобов, поэтому, если Foo есть:
Foo - String id - String name - Collection bars
JAXB выводит что -то вроде:
u003Cfoo>u003Cid>123>/id>u003Cname> foo nameu003C/name>u003C/foo> <- Обратите внимание на отсутствие атрибута баров
Что проблематично, так как у клиента нет способа, чтобы можно было разумно знать, что у Foo есть бары, если только он «просто не знает» (что мне кажется плохим). Поэтому, пока я могу себе представить, чтобы получить список баров, использующих:
ПОЛУЧИТЬ http: // xxx/fooservice/foo/121/bars
Как клиент узнает, что у Foo есть бары, если результаты объекта ничего не говорят об этом? Теперь предполагая, что клиент действительно получает список, тогда, похоже, операции сущности будут что -то вроде:
Получить/удалить/обновить http: // xxx/fooservice/foo/121/bar/435
который получил бы доступ к Bar 435, принадлежащему Foo 121.
Решение
То, что вы хотите сделать, безусловно, возможно. Один из способов разработки ресурсов - это:
/foo
# A list of all the Foo resource names (not representations).
/foo/{fooid}
# A detailed representation of a particular Foo, including
# a list of all that Foo's Bar resource names (not representations).
/foo/{fooid}/bar/{barid}
# A detailed representation of a particular Bar.
У вас может быть ситуация, когда бары не имеют реального существования за пределами конкретного Foo (как в мастере заказа на покупку и в деталях, которые он содержит). Если это так, и у каждого Foo не было так много данных, чтобы пойти с ним, вы можете вернуть полную панель данных прямо в представлении Foo:
/foo
# A list of all the Foo resource names (not representations).
/foo/{fooid}
# A detailed representation of a particular Foo, including
# full details on each of its Bars.
Как правило, вы хотите более грубое детализацию с ресурсами REST. Обратите внимание, что если вы выберете это, то чтобы изменить бары Foo, вы получите Foo, измените бары в представлении Foo, а затем положите Foo.
Не уверен, что происходит с вашими сериализованными представлениями XML, вы должны создать второй вопрос с соответствующим кодом.
Другие советы
Спасибо за подробный пост - то, что вы описываете, в основном уже то, что я делаю без подробного представления батончиков внутри каждого Foo, как вы предлагаете, так что кажется, что я в основном правильно.
Я узнаю, почему коллекция батончиков внутри Foo не становится безрассудным как XML в JAXB в отдельном Q, как вы предлагаете.
Тейлор, реализация Джерси JAX-RS, безусловно, выпускает свойства списка объектов, которые он преобразует в XML или JSON. Итак, в приложении, которое я только что закончил, у объекта Userstore есть свойство, пользователи, это список:
List<User> users = new ArrayList<User>();
Когда я использую Джерси, чтобы излучать версию Userstore XML или JSON, я получаю множество пользователей для этого свойства:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<users>
<user>
<firstName>John</firstName>
<id>a29a377f-4329-4ec8-9459-b5b1c2efc38a</id>
<lastName>Doe</lastName>
</user>
<user>
<firstName>Jane</firstName>
<id>bb4dad28-1263-440a-afc5-062a8566ef90</id>
<lastName>Roe</lastName>
</user>
</users>
а также
{
"user": [{
"firstName": "John",
"id": "a29a377f-4329-4ec8-9459-b5b1c2efc38a",
"lastName": "Doe",
},
{
"firstName": "Jane",
"id": "bb4dad28-1263-440a-afc5-062a8566ef90",
"lastName": "Roe",
}]
}
Возможно, проблема, с которой вы сталкиваетесь, просто связана с тем, что ваша собственность является коллекцией, а не списком ...
Для меня этот вопрос ответа будет обусловлен моделированием данных, и для моделирования данных вопрос «использование композитного ключа для детской модели или нет», если он использует композитный ключ, поэтому вы должны поместить родительский идентификатор в URI, если нет, а и У ребенка есть свой собственный идентификатор, который не является составным, поэтому вы можете просто использовать URL только с детьми.
Итак, это вопрос моделирования данных !!!