Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Создание новых ресурсов (POST)

20/04/2025, by Ivan

На этой странице приведены примеры POST-запросов для модуля JSON:API.

POST-запросы используются для создания новых ресурсов. Если вы хотите изменить ресурс — используйте PATCH-запрос.

Спецификация JSON:API (а значит и модуль JSON:API в Drupal) поддерживает создание только одного ресурса за один POST-запрос. Создание нескольких связанных сущностей в одном запросе невозможно. Для этого рекомендуется использовать модуль Subrequests.

Включение операций создания

Перейдите в /admin/config/services/jsonapi
и установите флажок «Accept all JSON:API create, read, update, and delete operations».

Create, Read, Update, Delete methods
Включение операций создания, чтения, обновления и удаления через JSON:API

Аутентификация

Для POST-запросов обычно требуется аутентификация. Примеры ниже используют Basic Auth — имя пользователя и пароль существующего пользователя Drupal с правом создавать указанный тип контента.

Включите модуль basic_auth, настройте разрешения роли и передайте закодированные данные в заголовке Authorization.

Пример использует пользователя с логином «api» и паролем «api».

Обязательные заголовки

  • Accept: application/vnd.api+json
  • Content-Type: application/vnd.api+json
  • Authorization: Basic YXBpOmFwaQ==

Curl-пример

curl \
  --user api:api \
  --header 'Accept: application/vnd.api+json' \
  --header 'Content-type: application/vnd.api+json' \
  --request POST http://drupal.d8/jsonapi/node/article \
  --data-binary @payload.json

Простой POST-запрос

URL: http://example.com/jsonapi/node/article

Тело запроса

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "My custom title",
      "body": {
        "value": "Custom value",
        "format": "plain_text"
      }
    }
  }
}

Ответ

HTTP 201 (Created). Тело ответа содержит объект JsonAPI с созданной сущностью.

POST-запрос с отношениями

URL: http://example.com/jsonapi/node/article

Поля ссылок на сущности указываются в relationships, а не в attributes, иначе будет ошибка.

id должен содержать UUID, а не числовой ID сущности.

Тело запроса

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Article by admin",
      "body": {
        "value": "Custom value",
        "format": "plain_text"
      }
    },
    "relationships": {
      "uid": {
        "data": {
          "type": "user--user",
          "id": "{{UUID пользователя}}"
        }
      },
      "field_taxonomy_term_reference": {
        "data": {
          "type": "taxonomy_term--{{bundle}}",
          "id": "{{UUID термина}}"
        }
      }
    }
  }
}

Ответ

HTTP 201 (Created). Возвращается объект JsonAPI с созданной сущностью.

POST через REST API

Создайте собственный модуль с ресурсом REST и включите его через /admin/config/services/rest.

Пример реализации ресурса (см. оригинал выше):

  • Создаёт узлы (Node::create) с типом и содержимым из полученных данных
  • Требует права «administer site content»

Пример JSON для создания узлов:

[
  {
    "nodetype": "article",
    "title": "Training",
    "body": "..."
  },
  {
    "nodetype": "page",
    "title": "Team Building",
    "body": "..."
  },
  {
    "nodetype": "article",
    "title": "Services",
    "body": "..."
  },
  {
    "nodetype": "page",
    "title": "Product Management",
    "body": "..."
  },
  {
    "nodetype": "article",
    "title": "Business Development",
    "body": "..."
  }
]

Curl-запрос к REST API:

curl \
  --user uname:password \
  --header 'Accept: application/json' \
  --header 'Content-type: application/json' \
  --request POST http://example.com/rest/api/post/node-create \
  --data-binary @post_data.json

Статья с сайта Drupal Documentation.