Что такое GraphQL?

GraphQL
Фото: Pexels

GraphQL — язык запросов и runtime для API, разработанный Facebook (ныне Meta). Клиент в одном HTTP-запросе описывает, какие поля и связи нужны; сервер возвращает JSON ровно этой формы. Это снижает over-fetching и under-fetching по сравнению с фиксированными REST-эндпоинтами.

flowchart LR
  Client["Клиент"] -->|query| GQL["GraphQL сервер"]
  GQL --> Schema["Схема + резолверы"]
  Schema --> DB["БД / сервисы"]

Клиент запрашивает дерево полей; резолверы достают данные из источников.

Схема, query и mutation

Схема (SDL) описывает типы Query, Mutation, Subscription. Query — чтение, Mutation — изменение. Резолвер — функция, которая по полю возвращает значение. Introspection позволяет клиентам и IDE (GraphiQL) изучать API без отдельной OpenAPI-спеки.

query {
  user(id: "1") {
    name
    posts { title }
  }
}

GraphQL и REST

REST даёт ресурсы по URL (/users/1, /users/1/posts) — иногда нужно несколько round-trip. GraphQL объединяет в один запрос, но усложняет кэширование на CDN (обычно POST) и требует контроля глубины/стоимости запросов (complexity limits, DataLoader против N+1).

Экосистема

Серверы: Apollo Server, GraphQL Yoga, Mercurius. Клиенты: Apollo Client, urql, Relay. Часто используют поверх существующего REST или ORM (Prisma, Drizzle) как единый BFF для фронтенда.

Когда уместен GraphQL

  • Много клиентов (web, mobile) с разными наборами полей.
  • Агрегация нескольких микросервисов за одним шлюзом.
  • Быстрая итерация API без версионирования десятков REST-путей.

Спецификация: graphql.org.

GraphQL — иллюстрация 2
Фото: Pexels
GraphQL — иллюстрация 3
Фото: Pexels

Частые вопросы

  • GraphQL заменяет REST?

    Не обязательно: GraphQL удобен для гибких клиентских API; REST проще кэшировать и документировать для публичных интеграций.

  • Что такое резолвер в GraphQL?

    Функция, которая по имени поля в запросе возвращает данные — из БД, другого сервиса или вычисляет на лету.

  • Почему GraphQL часто POST?

    Тело запроса содержит произвольный query; для кэша HTTP GET возможен, но на практике чаще POST с лимитами сложности.

Не хватает деталей?

Напишите, что уточнить по теме «GraphQL» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться