JSONAPI: обновить отношения, включая атрибуты - PullRequest
0 голосов
/ 29 мая 2018

В моей таблице SQLAlchemy есть вложенный объект, созданный с помощью функции вложенной схемы Marshmallow .Например, ответ GET объекта articles будет включать в себя объект author (тип User) вместе с ним.

Я знаю, что спецификация JSONAPI уже позволяет обновлять отношения.Тем не менее, часто я хотел бы обновить статью с вложенными объектами за один вызов (POST-запросы статей, которые включают нового автора, автоматически создают автора).Можно ли сделать запрос PATCH, который включает в себя ресурсы объекта отношения, который еще не существует?

Так что вместо этого:

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

{
  "data": {
    "type": "articles",
    "id": "1",
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "1" }
      }
    }
  }
}

Было бы идеальнопередать это, чтобы создать нового автора, если его еще не было (это не мой фактический вариант использования, но у меня есть аналогичная реальная потребность в жизни):

PATCH /articles/1 HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
  "data": {
    "type": "articles",
    "id": "1",
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "1", "attributes": {"name": "new author":, "articles_written": 1} }
      }
    }
  }
}

Возможно ли это вообще илипредложения о том, какие REST-фреймворки могут поддерживать это, или это полностью противоречит спецификации JSON API?

1 Ответ

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

Обновление нескольких ресурсов одновременно невозможно с JSON API spec v1.0.Но есть несколько предложений, как это сделать.Оба официальные расширения , которые больше не поддерживаются , предназначены для поддержки создания, обновления или удаления нескольких запросов одновременно.Также существует открытый запрос на извлечение, который вводит операции в предстоящую спецификацию JSON API v1.2 .

Например, запрос на обновление двух ресурсов одновременно с использованием предложенных операций [1] будет выглядеть так:this:

PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
  "operations": [{
    "op": "update",
    "ref": {
      "type": "articles",
      "id": "1"
    },
    "data": {
      "type": "articles",
      "id": "1",
      "attributes": {
        "title": "Updated title of articles 1"
      }
    }
  }, {
    "op": "update",
    "ref": {
      "type": "people",
      "id": "2"
    },
    "data": {
      "type": "people",
      "id": "2",
      "attributes": {
        "name": "updated name of author 2"
      }
    }
  }]
}

Это обновит атрибут title article с идентификатором 1 и атрибут name ресурса person с идентификатором 2 в одной транзакции.

Запрос на обновление отношения «один к одному» и обновление соответствующего ресурса в отдельной транзакции будет выглядеть следующим образом:

PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
  "operations": [{
    "op": "update",
    "ref": {
      "type": "articles",
      "id": "1",
      "relationship": "author"
    },
    "data": {
      "type": "people",
      "id": "2"
    }
  }, {
    "op": "update",
    "ref": {
      "type": "people",
      "id": "2"
    },
    "data": {
      "type": "people",
      "id": "2",
      "attributes": {
        "name": "updated name of author 2"
      }
    }
  }]
}

Это запрос, который создает новый person и связывает его какauthor к существующему article с идентификатором 1:

PATCH /bulk HTTP/1.1
Host: example.org
Content-Type: application/vnd.api+json

{
  "operations": [{
    "op": "add",
    "ref": {
      "type": "people"
    },
    "data": {
      "type": "people",
      "lid": "a",
      "attributes": {
        "name": "name of new person"
      }
    }
  }, {
    "op": "update",
    "ref": {
      "type": "articles",
      "id": "1",
      "relationship": "author"
    },
    "data": {
      "type": "people",
      "lid": "a"
    }
  }]
}

Обратите внимание, что порядок важен.Операции должны выполняться по порядку сервером.Таким образом, ресурс должен быть создан, прежде чем он может быть связан с существующим.Чтобы выразить связь, мы используем локальный идентификатор (lid).

Обратите внимание, что операции должны использоваться только в том случае, если запрос должен быть выполнен транзакционным.Если каждая из включенных операций может быть выполнена атомарно, следует использовать единичные запросы.

В соответствии с списком реализации, представленным на jsonapi.org , есть несколько библиотек, поддерживающих расширение Patch.

Обновление: Операции не были включены в версию-кандидат для JSON API v1.1.Это запланировано на v1.2 сейчас.Автор запроса на извлечение, который также является одним из сопровождающих спецификации, сказал , что «операции сейчас имеют наивысший приоритет».Кандидат на выпуск v1.2, включая Operations, может быть отправлен «RC в течение нескольких месяцев после финальной версии 1.1».

[1] Введение операций в JSON API v1.2 в настоящее время только предлагается, но не объединяется.,Там могут быть серьезные изменения.Прочитайте связанный запрос на получение перед реализацией.

...