Как создать дочерний объект во многих отношениях с 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"
}
}
]
}
Ответы
Ответ 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].