Открыть сервис

GraphQL

GraphQL — это язык запросов и среда выполнения для API (интерфейсов программирования приложений), разработанный компанией Facebook (организация Meta признана экстремистской и запрещена в РФ) в 2012 году и открытый для публичного использования в 2015 году. В отличие от традиционных REST API, где сервер определяет структуру возвращаемых данных, GraphQL предоставляет клиенту возможность запрашивать именно те данные, которые ему необходимы, и в ожидаемом формате. Основными компонентами GraphQL являются схема (schema), определяющая типы данных и связи между ними, и язык запросов, позволяющий клиентам формулировать требования к данным.

История

Разработка в Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ)

GraphQL был создан внутренней командой Facebook для решения проблем, связанных с разработкой мобильного приложения. В REST API, используемом ранее, каждый экран приложения требовал нескольких запросов к разным эндпоинтам, что приводило к избыточной загрузке данных (over-fetching) и замедлению работы на мобильных устройствах. В 2012 году инженеры Ли Байрон, Дэн Шафер, Ник Шрок и другие начали разработку новой спецификации, которая позволила бы клиенту описывать структуру ответа.

В 2015 году Facebook опубликовал спецификацию GraphQL и эталонную реализацию на JavaScript (GraphQL.js) под лицензией MIT. В 2018 году проект был передан в некоммерческую организацию GraphQL Foundation, управляемую Linux Foundation, для обеспечения независимого развития.

Распространение и стандартизация

После открытия исходного кода GraphQL быстро привлёк внимание разработчиков. Крупные компании, такие как GitHub, Shopify, Twitter, Yelp и The New York Times, начали внедрять GraphQL в свои продукты. В 2019 году была выпущена версия спецификации GraphQL «June 2018», которая стала стабильной. В 2021 году вышло обновление «October 2021», добавившее поддержку пользовательских директив и улучшенную обработку ошибок.

В России GraphQL используется в ряде IT-компаний, включая Яндекс, Тинькофф и VK, для построения внутренних и публичных API.

Архитектура и принципы работы

Схема и типы

Сервер GraphQL определяет схему (schema), которая описывает все возможные типы данных и операции. Основные типы:

Схема также определяет три корневых типа:

Запросы и ответы

Клиент отправляет запрос на единственный эндпоинт (обычно /graphql) в формате JSON или строки запроса. Пример запроса:

`` query { user(id: 42) { name email posts { title } } } ``

Сервер возвращает JSON-ответ, структура которого точно соответствует запросу:

`` { "data": { "user": { "name": "Иван Петров", "email": "ivan@example.com", "posts": [ { "title": "Первая статья" }, { "title": "Вторая статья" } ] } } } ``

Резолверы

Каждое поле в схеме связано с функцией-резолвером (resolver), которая определяет, как получить данные для этого поля. Резолверы могут обращаться к базам данных, внешним API или вычислять значения на лету. GraphQL выполняет запрос, вызывая резолверы для каждого запрошенного поля, что позволяет избежать избыточных запросов (N+1 problem) с помощью инструментов вроде DataLoader.

Преимущества и недостатки

Преимущества

Недостатки

Инструменты и экосистема

Серверные реализации

GraphQL поддерживается на большинстве языков программирования:

Клиентские библиотеки

Для работы с GraphQL на клиенте используются:

Инструменты разработки

Применение

Веб-разработка

GraphQL широко используется в одностраничных приложениях (SPA) на React, Vue и Angular. Например, интернет-магазины (Shopify, Magento) предоставляют GraphQL API для управления товарами и заказами. Социальные сети (Twitter, LinkedIn) используют GraphQL для лент новостей и профилей пользователей.

Мобильные приложения

Из-за ограничений мобильного трафика GraphQL особенно полезен для iOS и Android. Приложения Facebook, Instagram (продукт Meta, признанной экстремистской и запрещённой в РФ) и GitHub Mobile используют GraphQL для загрузки данных.

Микросервисы

GraphQL может служить шлюзом (API Gateway) для объединения нескольких микросервисов. Например, сервис каталога товаров, сервис пользователей и сервис заказов могут быть объединены в единый GraphQL-эндпоинт.

Реальное время

Подписки GraphQL применяются в чатах (Slack, Discord), системах мониторинга (Datadog) и финансовых приложениях (Robinhood) для мгновенного обновления данных.

Сравнение с REST

ХарактеристикаRESTGraphQL
ЭндпоинтыМножество (один на ресурс)Один
Формат ответаФиксированный (определён сервером)Динамический (определяется запросом)
Избыточность данныхЧасто есть (over-fetching)Минимальная (только запрошенные поля)
Кэширование HTTPПростое (через URL)Сложное (через ID или персистентные запросы)
ТипизацияОпционально (OpenAPI/Swagger)Обязательна (схема)
ВерсионированиеЧерез URL (/v1/, /v2/)Через эволюцию схемы (без версий)

Критика

GraphQL подвергается критике за сложность реализации кэширования и потенциальную неэффективность при работе с реляционными данными без использования специализированных инструментов (DataLoader). Некоторые разработчики отмечают, что для простых API с малым числом сущностей REST остаётся более простым и предсказуемым решением. Кроме того, отсутствие встроенной поддержки загрузки файлов (до версии спецификации 2021 года) требовало дополнительных решений (например, multipart-запросов).

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →