GraphQL за 15 минут: Простое объяснение с примерами

GraphQL — это язык запросов и серверная среда для API с открытым исходным кодом. Он появился в Facebook в 2012 году и был разработан для упрощения управления конечными точками API, основанными на REST. В 2015 году код GraphQL стал открытым, и сейчас его используют такие компании, как Airbnb, GitHub, Pinterest, Shopify и многие другие.

Почему появился GraphQL?

Разработчики Facebook, создавая мобильное приложение, столкнулись с проблемой медленной работы при одновременном запросе данных из различных баз данных (например, облачной Redis и MySQL). Для решения этой задачи был создан собственный язык запросов, который обращается к одной конечной точке и упрощает форму запрашиваемых данных. Это было особенно актуально для социальной сети с большим количеством связей и запросов по связанным элементам (например, получение постов всех подписчиков пользователя).

GraphQL vs REST API: основные различия

REST — это хороший инструмент, но имеет некоторые недостатки:

  • Избыточность или недостаток данных: Клиенты REST API часто получают либо слишком много ненужных данных, либо слишком мало, что вынуждает делать несколько запросов. GraphQL позволяет клиентам запрашивать только необходимые данные и получать их в одном запросе.
  • Расширяемость: В REST API каждый endpoint обычно соответствует определённому ресурсу, что может создавать проблемы с расширяемостью и версиями API. В GraphQL существует единая конечная точка для всех запросов, а схема API определяется на стороне сервера, что делает API более гибким.
  • Проблема N+1 запросов: При работе со связанными данными в REST API часто возникает проблема N+1 запросов. GraphQL позволяет выразить связи между данными и получать все необходимые данные в одном запросе. Например, для получения списка пользователей и их последних постов в REST потребовались бы отдельные запросы для пользователей и для каждого пользователя — отдельный запрос на посты. В GraphQL это можно сделать одним запросом.

Как работает GraphQL

GraphQL представляет собой структуру данных в виде графа, где узлы — это объекты, а рёбра — связи между ними. Это отражает способ организации данных и запросов в GraphQL, где клиенты могут запрашивать связанные данные, получая только необходимые. GraphQL обращается к определённой записи (корневому узлу) и получает все детали этой записи. Можно, например, получить подписчиков конкретного пользователя.

Типы запросов в GraphQL

GraphQL имеет три основных типа запросов:

  • Query: Запросы для получения данных с сервера. Запросы представляют собой строки, отправляемые в теле HTTP POST-запроса (хотя GraphQL может работать и через веб-сокеты, gRPC и другие протоколы). Пример: получение имени и возраста всех пользователей. Ответ приходит в формате JSON, структура которого соответствует структуре запроса. В ответе может быть ключ errors для отображения ошибок.
  • Mutation: Запросы для добавления, изменения или удаления данных. Аналог POST и PUT в REST. Пример: создание нового пользователя. Ответ содержит ID созданной записи.
  • Subscription: Запросы для получения обновлений данных в режиме реального времени с использованием веб-сокетов. Пример: получение списка пользователей с количеством лайков, которое обновляется в режиме реального времени при каждом изменении.

Элементы запросов GraphQL

В запросах GraphQL используются следующие концепции: поля, аргументы, псевдонимы, фрагменты, переменные и директивы.

  • Поля (Fields): Имена свойств объектов, которые нужно получить.
  • Аргументы (Arguments): Значения, передаваемые в поля для уточнения запроса (например, ID пользователя).
  • Псевдонимы (Aliases): Переименование полей в ответе для различения полей с одинаковыми именами из разных источников.
  • Фрагменты (Fragments): Разделение сложных запросов на более мелкие, повторно используемые части. Полезно для организации кода и избежания дублирования.
  • Переменные (Variables): Динамическое указание значений в запросе, передаваемые отдельно от запроса.
  • Директивы (Directives): Динамическое управление структурой запроса с помощью @include (включает поле, если значение переменной true) и @skip (пропускает поле, если значение переменной true).

Схема GraphQL

Для работы с GraphQL на сервере необходима схема, определяющая логику работы API, типы и структуру данных. Схема состоит из:

  • typeDefs: Определяет список доступных типов данных (например, User с полями fname, age, likes). GraphQL поддерживает типы String, Int, Float и Boolean. Восклицательный знак (!) обозначает обязательное поле.
  • Resolvers: Функции, которые возвращают данные для определённых полей. Они могут быть асинхронными и получать данные из баз данных, API и других источников.

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

  • Гибкость: GraphQL не накладывает ограничений на типы запросов.
  • Определение схемы: Автоматически создаёт схему API, упрощая организацию кода.
  • Оптимизация запросов: Клиенты запрашивают только необходимые данные, уменьшая время ответа и объём передаваемых данных.
  • Контекст: Учитывает детали запросов и ответов, облегчая отладку.
  • Расширяемость: Позволяет расширять схемы API и добавлять новые типы данных с повторным использованием существующего кода.

GraphQL — мощный инструмент для создания эффективных и гибких API. Его преимущества в оптимизации запросов, гибкости и расширяемости делают его привлекательным вариантом для многих приложений.

Что будем искать? Например,программа