Я уже опубликовал это в дискуссионной группе HAL, но не получил большого отклика,
В нашей команде разработчиков продолжается обсуждение того, как POST-представления родительских дочерних композиций, например, используются длязаказать-> элементы заказа.Предположим, что мы не хотим, чтобы позиции заказа были независимыми ресурсами, а были вложены в заказы.Мы обсудили до сих пор 3 возможности:
Вложенные элементы, не смоделированные как представление ресурса:
{
"name": "Order Name",
"items": [
{
"name": "Item A",
"quantity": 20,
"shopProductHref": "/api/shops/someshop/products/4159313e-3b79-11e5-a151-feff819cdc9f"
},
{
"name": "Item B",
"quantity": 5,
"shopProductHref": "/api/shops/someshop/products/e36bb0dc-3b79-11e5-a151-feff819cdc9f"
}
],
"_links": {
"/api/shops/orders/invoice_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/orders/shipment_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/someshop": {
"href": "/api/shops/someshop/shippingmethods/a643cf54-3b7a-11e5-a151-feff819cdc9f"
}
}
}
Вложенные элементы, смоделированные как представления ресурса:
{
"name": "Order Name",
"items": [
{
"name": "Item A",
"quantity": 20,
"_links": {
"shopProduct": {
"href": "/api/shops/someshop/products/4159313e-3b79-11e5-a151-feff819cdc9f"
}
}
},
{
"name": "Item B",
"quantity": 5,
"_links": {
"shopProduct": {
"href": "/api/shops/someshop/products/e36bb0dc-3b79-11e5-a151-feff819cdc9f"
}
}
}
],
"_links": {
"/api/shops/orders/invoice_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/orders/shipment_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/someshop": {
"href": "/api/shops/someshop/shippingmethods/a643cf54-3b7a-11e5-a151-feff819cdc9f"
}
}
}
Вложенные элементы:
{
"name": "Order Name",
"_links": {
"/api/shops/orders/invoice_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/orders/shipment_address": {
"href": "/api/core/users/someuser/addresses/38271476-3b7b-11e5-a151-feff819cdc9f"
},
"/api/shops/someshop": {
"href": "/api/shops/someshop/shippingmethods/a643cf54-3b7a-11e5-a151-feff819cdc9f"
}
},
"_embedded": {
"items": [
{
"name": "Item A",
"quantity": 20,
"_links": {
"shopProduct": {
"href": "/api/shops/someshop/products/4159313e-3b79-11e5-a151-feff819cdc9f"
}
}
},
{
"name": "Item B",
"quantity": 5,
"_links": {
"shopProduct": {
"href": "/api/shops/someshop/products/e36bb0dc-3b79-11e5-a151-feff819cdc9f"
}
}
}
]
}
}
Наши мысли пока:
Вложенные элементы, не смоделированные как представление ресурса:
PRO:
- Наиболее компактный и удобный для чтения.
- Наиболее выполнимый для используемого нами механизма самодокументирования (JsonDoc on Spring).
CON:
- Мы не знаем, будет ли этот подход считаться совместимым с HAL?
- Не используется универсальныйфункциональность развертывания мы реализовали для "_links" и "_embedded".
- Всегда заставляет нас иметь разные представления для ввода и вывода заказа.
Вложенные элементы, смоделированные как представления ресурсов:
PRO:
- Повторное использование универсальной функции развертывания.
- Может также использоваться в качестве выходного представления в большинстве случаев.
CON:
- Менее компактный, чем подход выше.Объекты "_links" встречаются во вложенных объектах, смоделированных как представления, совместим ли этот HAL?
- Если использовать с кюри, на каком уровне поставить определение кюри?Ожидаемая структура JSON не может быть получена из автоматизированного инструмента документирования API.
Встроенные элементы:
PRO:
- Повторное использованиеуниверсальная функция развертывания.
- Может также использоваться в качестве выходного представления в большинстве случаев.
- Все модели представления находятся в одном и том же ожидаемом месте в "_embedded".
CON:
- В спецификации HAL вводится _embeddedкак стратегия кеширования, которая может дать устаревшие и неполные результаты, а НЕ как метод ввода.
- Менее компактен, чем оба подхода выше.
- Ожидаемая структура JSON не может быть получена из автоматизированного инструмента документирования API.
Какую из 3 моделей вы предпочитаете и почему?
С уважением,
Мариус Шмидт