Как разместить родительско-дочернюю композицию, используя hal + json, где дочерние элементы ссылаются на независимые ресурсы? - PullRequest
0 голосов
/ 01 апреля 2019

Я уже опубликовал это в дискуссионной группе 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:

  1. Наиболее компактный и удобный для чтения.
  2. Наиболее выполнимый для используемого нами механизма самодокументирования (JsonDoc on Spring).

CON:

  1. Мы не знаем, будет ли этот подход считаться совместимым с HAL?
  2. Не используется универсальныйфункциональность развертывания мы реализовали для "_links" и "_embedded".
  3. Всегда заставляет нас иметь разные представления для ввода и вывода заказа.

Вложенные элементы, смоделированные как представления ресурсов:

PRO:

  1. Повторное использование универсальной функции развертывания.
  2. Может также использоваться в качестве выходного представления в большинстве случаев.

CON:

  1. Менее компактный, чем подход выше.Объекты "_links" встречаются во вложенных объектах, смоделированных как представления, совместим ли этот HAL?
  2. Если использовать с кюри, на каком уровне поставить определение кюри?Ожидаемая структура JSON не может быть получена из автоматизированного инструмента документирования API.

Встроенные элементы:

PRO:

  1. Повторное использованиеуниверсальная функция развертывания.
  2. Может также использоваться в качестве выходного представления в большинстве случаев.
  3. Все модели представления находятся в одном и том же ожидаемом месте в "_embedded".

CON:

  1. В спецификации HAL вводится _embeddedкак стратегия кеширования, которая может дать устаревшие и неполные результаты, а НЕ как метод ввода.
  2. Менее компактен, чем оба подхода выше.
  3. Ожидаемая структура JSON не может быть получена из автоматизированного инструмента документирования API.

Какую из 3 моделей вы предпочитаете и почему?

С уважением,

Мариус Шмидт

...