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
20/04/2025, by Ivan

Кратко (TL;DR): Используйте строку запроса вида ?include=field_comments.uid, чтобы включить все сущности, на которые ссылается field_comments, а также все сущности, на которые ссылается uid в этих сущностях!


JSON:API позволяет сократить количество HTTP-запросов, позволяя указать пути связей, которые вы хотите включить в документ ответа. Как это работает?

Получение одиночных ресурсов

Получение статьи

Допустим, у вас есть статья с двумя комментариями, и у обоих комментариев — один и тот же автор. Чтобы получить все эти данные без include, сначала нужно выполнить запрос GET /jsonapi/node/article/some-random-uuid:

{
  "data": {
    "type": "node--article",
    "id": "some-random-uuid",
    "relationships": {
      "field_comments": {
        "links": {
          "related": {
            "href": "https://my.example.com/node/article/some-random-uuid/field_comments"
          }
        }
      }
    }
  }
}

Получение комментариев

Затем — запрос по адресу GET /node/article/some-random-uuid/field_comments:

{
  "data": [{
    "type": "comment",
    "id": "one-random-uuid",
    "relationships": {
      "uid": {
        "links": {
          "related": {
            "href": "https://my.example.com/comment/one-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "comment",
    "id": "two-random-uuid",
    "relationships": {
      "uid": {
        "links": {
          "related": {
            "href": "https://my.example.com/comment/two-random-uuid/uid"
          }
        }
      }
    }
  }]
}

Получение пользователей

И затем ещё два запроса — к /comment/one-random-uuid/uid и /comment/two-random-uuid/uid. Однако второй запрос будет избыточным, ведь автор у комментариев один и тот же.

Как нам поможет include?

Получение всего сразу с помощью include

Просто добавьте параметр запроса к URL: ?include=field_comments.uid. Это укажет серверу добавить в ответ все сущности, на которые ссылается field_comments, и все сущности, на которые ссылается uid у этих комментариев.

Запрос: GET /jsonapi/node/article/some-random-uuid?include=field_comments.uid

Ответ от сервера будет выглядеть так:

{
  "data": {
    "type": "node--article",
    "id": "some-random-uuid",
    "relationships": {
      "field_comments": {
        "data": [{
          "type": "comment",
          "id": "one-random-uuid"
        }, {
          "type": "comment",
          "id": "two-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/node/article/some-random-uuid/field_comments"
          }
        }
      }
    }
  },
  "included": [{
    "type": "comment",
    "id": "one-random-uuid",
    "relationships": {
      "uid": {
        "data": [{
          "type": "user",
          "id": "another-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/comment/one-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "comment",
    "id": "another-random-uuid",
    "relationships": {
      "uid": {
        "data": [{
          "type": "user",
          "id": "one-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/comment/two-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "user",
    "id": "another-random-uuid",
    "attributes": {
      "name": "c0wb0yC0d3r"
    }
  }]
}

Круто, правда? Все данные получены одним запросом! Обратите внимание, что объект пользователя включён только один раз, даже если он упоминается дважды — это снижает размер ответа. Также у каждого объекта связи появился ключ data, позволяющий связать включённые сущности с их источниками.

Когда использовать include?

Хотя include позволяет получить всё сразу, это может значительно увеличить размер ответа или замедлить его генерацию. В некоторых случаях лучше делать параллельные запросы.

Include для коллекций и связей

Параметр include поддерживается и в коллекциях, и в ресурсах-связях. Использование include в коллекциях может сэкономить множество запросов.

Пример include для коллекции

Запрос: GET /jsonapi/node/article?include=uid

Ответ будет выглядеть примерно так:

{
  "data": [{...}],
  "included": [{
    "type": "user",
    "id": "another-random-uuid",
    "attributes": {
      "name": "c0wb0yC0d3r"
    }
  }]
}

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