- PVSM.RU - https://www.pvsm.ru -
Сегодня GraphQL остаётся одной из самых популярных технологий для работы с API, особенно в среде веб-разработки. В этой статье я проведу экскурс, напомню, что такое GraphQL, его ключевые особенности, как быстро настроить собственный GraphQL-сервер, какие интересные публичные API можно попробовать и что использовать для его интеграции с фронтендом. А также заглянем в будущее GraphQL в 2025 году.

GraphQL — это язык запросов к API и среда выполнения, разработанный Facebook в 2012 году и опубликованная как open source в 2015 году. Основное преимущество GraphQL заключается в том, что он предоставляет клиенту возможность запрашивать только те данные, которые ему необходимы, и в удобной структуре.
На изображении ниже показан, простой пример GraphQL query запроса. Запрашиваю страну, где code равен RU, с указанием необходимых полей для получения.

В GraphQL есть три вида запросов:
Query - получение данных (аналог GET запроса в REST)
Mutation - добавление и изменение данных (аналог POST, PUT запроса в REST)
Subscription - подписка на изменение данных. Но с ними не все так однозначно, подробнее о них написано здесь [1].
Гибкость запросов: позволяет клиенту запрашивать только те данные, которые ему действительно нужны.
Единая точка входа: есть только один endpoint (обычно /graphql), через который проходят все запросы.
Schema definition language (SDN): GraphQL API основывается на схеме, которая описывает все доступные данные, их типы и связи между ними. Подробнее о том, как читать SDL можно почитать в этой статье [2]
Поддержка real-time: Subscriptions позволяют подписаться на обновления.
Сильная типизация: все данные строго типизированы, что помогает избежать ошибок. Типы включают стандартные (String, Int, Float, Boolean, Enum ) и на их основе можно создавать пользовательские типы данных.
Единый источник данных: GraphQL может объединять данные из разных источников (базы данных, REST API, микросервисы и т.д.) в единый API
Широкая экосистема инструментов: доступны различные генераторы кода для клиентов, поддерживающие полную спецификацию GraphQL. Одна из ключевых функций — встроенная поддержка кэширования запросов.
И чтобы долго не задерживаться на теории, давайте сразу перейдем к практике и попробуем GraphQL в действии! А если хочется больше теории, на хабре есть для этого статья [3] .
Если вы хотите быстро создать свой GraphQL API, есть множество инструментов, которые помогут вам это сделать. Все инструменты я сам использовал в продакшене.
Hasura
Автоматически генерирует GraphQL API поверх вашей базы данных (PostgreSQL), так же позволяет строить федерации - это построение единого шлюза для нескольких сервисов. Сам я на проектах использую версию v2 self-hosted. Быстрый старт [4]
Directus
Это Headless CMS + Backend, накладывает API на существующую базу данных и позволяет быстро создавать админ-панели. Очень простой и удобный инструмент для запуска MVP, что-то большее не довелось сделать на нем. Быстрый старт [5]

Apollo Server
Apollo Server - это сервер GraphQL с открытым исходным кодом, совместимый со спецификациями, который совместим с любым клиентом GraphQL, включая клиента Apollo. Не самый быстрый старт [6]
Если не хочется поднимать свой GraphQL, то для этого случая я собрал несколько примеров публичных API GraphQL на которых можно прямо сейчас попробовать написать запросы и получить первое представление как это работает.
GitHub API: [8]
Gitlab API [9]
Rick and Morty API [10]
Countries API [11]
Эндпоинты GraphQL схем можно добавить в Sdudio Apollo [12], указав при необходимости заголовки авторизации.
Чтобы быстро и удобно подключить GraphQL на клиенте, рекомендую использовать Apollo Client. Также обязательно настройте кодогенерацию [13] — это значительно упростит разработку за счет автоматического создания типов данных, хуков, классов и других вспомогательных структур на основе схемы, и все со строгой типизацией.
Apollo Client поддерживает:
React [14] и React Native. Также совместим с другими веб-фреймворками [15], но основная документация сосредоточена на React.
iOS [16].
Kotlin [17].
Для Flutter рекомендую использовать graphql_flutter [18] и graphql_codegen [19].
Обязательная поддержка application/graphql-response+json:
С 1 января 2025 года серверы обязаны поддерживать медиа-тип application/graphql-response+json для ответов на запросы, которые указывают этот тип в заголовке Accept.
Это изменение направлено на улучшение совместимости и надежности, так как application/graphql-response+json лучше подходит для обработки ошибок и частичных ответов в GraphQL.
Кодировка UTF-8:
Ответы, использующие application/graphql-response+json, должны быть закодированы в UTF-8.
Изменение поведения по умолчанию:
Если клиент не указывает заголовок Accept, сервер должен рассматривать запрос как если бы он содержал Accept: application/graphql-response+json. Это изменение направлено на постепенный отход от использования application/json для ответов GraphQL.
Статус коды:
При использовании application/graphql-response+json сервер должен возвращать соответствующие статус-коды HTTP (например, 4xx или 5xx) в случае ошибок, которые полностью препятствуют генерации корректного GraphQL-ответа. Это отличается от текущей практики, где серверы могут возвращать 200 OK даже при ошибках.
Легаси-совместимость:
До 2025 года клиентам рекомендуется включать application/json в заголовок Acceptдля обеспечения совместимости с устаревшими серверами. После 2025 года это больше не будет необходимо.
В итоге это означает, что мем о некорректных статусных кодах GraphQL потеряет актуальность, и это отличная новость! 🚀

Естественно GraphQL, имеет недостатки, и для меня это то что он сложен для разработчиков для того чтобы быстро в него въехать. И то, что иногда недостаточно уметь писать запросы, а нужно понимать как они будут выполняться, иначе может привести это, например, к долгому выполнению запроса и избыточной нагрузки на сервер. Особенно часто это бывает в сервисах которые строят GraphQL схему на основе БД. И тем самым гибкость о которой говорят уже приводит к плачевным последствиям.
На хабре можно найти статьи, в которых описываются боли с которыми встретились разработчики: 1 [22], 2 [23].
В заключение хочется сказать, что для меня GraphQL — это удобный способ передачи данных между сервером и клиентом, который сокращает время разработки и помогает оптимизировать процессы.
В 2025 году исполняется 10 лет с момента, как GraphQL стал open source! По этому случаю на GraphQL Conf [24] пройдёт празднование десятилетия.
GraphQL по-прежнему остаётся востребованной технологией: он активно используется, о нём пишут как о плюсах, так и о минусах, его обсуждают на конференциях, а знания GraphQL часто требуются в вакансиях. Я считаю, что важно понимать, как он работает, и уметь применять его на практике. Надеюсь, этот экскурс помог вам разобраться в основах и попробовать GraphQL в действии!
Автор: velund_zv
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/apollo/409728
Ссылки в тексте:
[1] здесь: https://habr.com/ru/articles/804641/
[2] статье: https://habr.com/ru/articles/876782/
[3] статья: https://habr.com/ru/articles/765064/
[4] Быстрый старт: https://hasura.io/docs/2.0/getting-started/overview/
[5] Быстрый старт: https://docs.directus.io/getting-started/quickstart.html
[6] Не самый быстрый старт: https://www.apollographql.com/docs/apollo-server/v3/getting-started
[7] SpaceX GraphQL API:: https://studio.apollographql.com/public/SpaceX-pxxbxen/variant/current/home
[8] GitHub API:: https://docs.github.com/en/graphql/overview/public-schema
[9] Gitlab API: https://gitlab.com/-/graphql-explorer
[10] Rick and Morty API: https://studio.apollographql.com/public/rick-and-morty-a3b90u/variant/current/home
[11] Countries API: https://studio.apollographql.com/public/countries/variant/current/explorer
[12] Sdudio Apollo: https://studio.apollographql.com/sandbox/explorer
[13] кодогенерацию: https://www.apollographql.com/docs/apollo-server/workflow/generate-types
[14] React: https://www.apollographql.com/docs/react/get-started
[15] веб-фреймворками: https://www.apollographql.com/docs/react#community-integrations
[16] iOS: https://www.apollographql.com/docs/ios/get-started
[17] Kotlin: https://www.apollographql.com/docs/kotlin
[18] graphql_flutter: https://pub.dev/packages/graphql_flutter
[19] graphql_codegen: https://pub.dev/packages/graphql_codegen
[20] Источник1: https://github.com/graphql/graphql-over-http/blob/main/spec/GraphQLOverHTTP.md?plain=1#L474
[21] Источник2: https://mbonnin.net/2025-01-13_graphql-errors/
[22] 1: https://habr.com/ru/articles/818765/
[23] 2: https://habr.com/ru/articles/728476/
[24] GraphQL Conf: https://graphql.org/conf/2025/
[25] Источник: https://habr.com/ru/articles/879322/?utm_source=habrahabr&utm_medium=rss&utm_campaign=879322
Нажмите здесь для печати.