REST API: как клиенту POSTing следует узнать о связанных идентификаторах? - PullRequest
0 голосов
/ 30 мая 2018

Я обновляю RESTful API, и он уже использует JSON API.

Я хочу включить POST для /quotes, но для кавычек необходимо иметь product.

Мой вопрос: как клиент должен знать и идентифицировать продукт, который должен быть связан с цитатой?

Вот несколько идей;Я приветствую других.

  1. Требуйте от клиента сначала GET /products, найдите нужный продукт в возвращенном списке, затем отправьте id соответствующего товара.
  2. Стандартизируйте некоторый общедоступный список кодов, который никогда не изменится, так что клиент может просто поверить, что код надежен.Например, если продукт является продуктом 1 от Acme, код может быть "acme_1" и т. Д.

Что касается варианта 2, код может быть отправлен как attribute или как relationship.То есть, мы могли бы сделать

// option 2a
"data": {
  "type": "accounts",
  "attributes": {
    "foo": "bar",
    "product_code": "acme_1"
  }
}

// option 2b
"data": {
  "type": "accounts",
  "attributes": {
    "foo": "bar"
  }
  relationships: {
    "type": "products",
    "id": "acme_1"
  }
}

Пожалуйста, присылайте мысли, предложения и / или читайте предложения!

1 Ответ

0 голосов
/ 31 мая 2018

Если у вас есть отношение «один ко многим» между quote и product, это должно быть отражено в вашей полезной нагрузке.Отношение должно быть в relationships ключе объекта ресурса.A resource linkage должно быть под data ключом relationships object.Поэтому оба ваших варианта, представленные как 2a и 2b, не соответствуют спецификации.Допустимая полезная нагрузка для создания ресурса, имеющего отношение, будет выглядеть следующим образом:

{
  "data": {
    "type": "accounts",
    "attributes": {
      "foo": "bar"
    }
    relationships: {
      "product": {
        "data": {
          "type": "products",
          "id": "acme_1"
        }
      }
    }
  }
}

Обратите внимание, что в примере показан объект отношения для отношения «один к».Если учетная запись может иметь много product data свойство объекта отношения должно быть массивом:

{
  "data": {
    "type": "accounts",
    "attributes": {
      "foo": "bar"
    }
    relationships: {
      "product": {
        "data": [
          {
            "type": "products",
            "id": "acme_1"
          },
          {
            "type": "products",
            "id": "acme_2"
          },
        ]
      }
    }
  }
}

С точки зрения спецификации JSON API это не имеет значениякак клиент знает, какой идентификатор связать.В спецификации указано , что id должен быть строкой и что комбинация type и id "должна идентифицировать один уникальный ресурс".

Конечно,Клиент должен знать, какой ресурс должен быть связан с созданным.Это полностью зависит от приложения, как реализовать это.Это может быть жестко закодировано или извлечено из серверной части.Из соображений масштабируемости и ремонтопригодности я бы рекомендовал не кодировать его жестко, если есть вероятность его регулярного изменения.Но с точки зрения спецификации JSON API это имеет значение только в том случае, если указанный ресурс существует.В противном случае сервер должен вернуть 404 Not Found.

...