Подтвердить что ты не робот

Как создать дочерний объект во многих отношениях с JSONAPI

Я читал через jsonapi docs, и я не могу окутать голову, как это практично. В соответствии с документами для добавления комментария к статье комментарий должен уже существовать.

POST /articles/1/relationships/comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "data": [
    { "type": "comments", "id": "123" }
  ]
}

Это просто плохой пример или действительно ли спецификация действительно хочет, чтобы вы отправили запрос на создание комментария , который не связан с сущностью, перед тем как выдать вышеуказанный запрос, чтобы связать его для общего из 2 запросов?

Казалось бы, вы скорее захотите опубликовать такой запрос:

POST /comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "data": {
    "type": "comments",
    "attributes": {
      "body": "blah blah blah"
    },
    "relationships": {
      "article": {
        "data": { "type": "articles", "id": "45" }
      }
    }
  }
}

или еще лучше:

POST /articles/45/relationships/comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "data": [
    { 
      "type": "comments", 
      "attributes": {
        "body": "blah blah blah"
      } 
    }
  ]
}
4b9b3361

Ответ 1

В соответствии с руководство JSONAPI по созданию ресурсов, следующий запрос создания ресурса, который очень похож на первое предложение OP, является действительным запросом.

POST /photos HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "data": {
    "type": "photos",
    "attributes": {
      "title": "Ember Hamster",
      "src": "http://example.com/images/productivity.png"
    },
    "relationships": {
      "photographer": {
        "data": { "type": "people", "id": "9" }
      }
    }
  }
}

Ответ 2

Да, это плохой пример - он указан в разделе "Связывание обновлений для многих" и предполагает, что комментарий уже существует. В реальной жизни ваш второй пример будет в порядке.

Существует понятие клиента, сгенерированного, которое передается вместе с данными, но предполагает, что клиент способен создавать глобально уникальный идентификатор, который, в случае комментариев, клиент, конечно, нет.

Сервер МОЖЕТ принимать идентификатор клиента, а также запрос на создать ресурс. ИД ДОЛЖЕН указываться ключом id, значение из которых ДОЛЖЕН быть универсально уникальным идентификатором. Клиент ДОЛЖЕН использовать правильно сгенерированный и отформатированный UUID, как описано в RFC 4122 [RFC4122].