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.