Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

JSON:API

JSON:API — модуль ядра, который отдаёт содержимое сайта в формате JSON по готовым адресам. Он нужен, когда данные Drupal читает другая программа: мобильное приложение, интерфейс на React или Vue, соседний сайт. Писать для этого код не требуется — модуль достаточно включить.

Включение

vendor/bin/drush en jsonapi

Модуль сам создаёт адреса для всех типов сущностей сайта. Файлы в модуле blog для этого не нужны.

Список статей

Адрес коллекции строится по правилу /jsonapi/тип_сущности/разновидность:

curl -g "http://127.0.0.1:8888/jsonapi/node/article"

Тот же адрес можно открыть в браузере. В ответ придёт JSON со списком статей:

{
  "data": [
    {
      "type": "node--article",
      "id": "3f0c6a1e-8a53-4b0a-9c1d-2f6d0e7b4a11",
      "attributes": {
        "title": "Первая статья",
        "status": true,
        "created": "2026-03-01T10:00:00+00:00"
      },
      "relationships": {
        "field_tags": { "data": [] }
      }
    }
  ],
  "links": {
    "self": { "href": "http://127.0.0.1:8888/jsonapi/node/article" }
  }
}

Обычные поля лежат в attributes, ссылки на другие сущности — в relationships. id здесь — не номер материала, а UUID: длинный уникальный идентификатор, который есть у каждой сущности.

Одна статья

curl -g "http://127.0.0.1:8888/jsonapi/node/article/3f0c6a1e-8a53-4b0a-9c1d-2f6d0e7b4a11"

В конце адреса указывают UUID из списка. Ответ содержит один объект в data.

Параметры запроса

ПараметрЧто делает
filter[status]=1Оставляет записи с таким значением поля
sort=-createdСортирует; минус — по убыванию
page[limit]=5Ограничивает количество
page[offset]=5Пропускает первые записи
fields[node--article]=title,createdВозвращает только перечисленные поля
include=field_tagsДобавляет в ответ связанные сущности

Параметры соединяют знаком &:

curl -g "http://127.0.0.1:8888/jsonapi/node/article?sort=-created&page[limit]=5&fields[node--article]=title,created"

Запрос вернёт пять свежих статей только с заголовком и датой. Ключ -g нужен программе curl, чтобы она не пыталась толковать квадратные скобки по-своему.

Права

JSON:API соблюдает те же права, что и сайт. Гость получит только опубликованные статьи и только если у него есть право «Просмотр опубликованного содержимого». Неопубликованные материалы и закрытые поля в ответ не попадут.

Запись

По умолчанию модуль работает только на чтение. Создание, изменение и удаление включают на странице «Конфигурация → Веб-сервисы → JSON:API», адрес /admin/config/services/jsonapi. После этого запросы POST, PATCH и DELETE начнут работать для пользователей с нужными правами; запрос должен быть авторизован — например, через модуль ядра HTTP Basic Authentication.

Свой адрес с JSON

Если нужен ответ своей структуры, а не весь материал, подойдёт обычный маршрут и контроллер, возвращающий JsonResponse, — он показан в уроке о контроллерах. JSON:API выбирают, когда нужны стандартные операции с сущностями, свой контроллер — когда нужен особый ответ.

Частая ошибка

В адресе JSON:API используют UUID, а не номер материала: /jsonapi/node/article/5 вернёт 404. Найти UUID можно в ответе коллекции или в коде — $node->uuid(). Чтобы получить материал по номеру, используйте фильтр: /jsonapi/node/article?filter[drupal_internal__nid]=5.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.