активное фото
60 000+ клиентов уже выбрали Макхост

Что такое GraphQL

GraphQL — один из современных языков запросов для API. Используя его, клиенты веб-приложений могут точно определять и получать именно те данные, которые им нужны. В статье мы рассмотрим основы GraphQL и расскажем о возможностях взаимодействия фронтендов и бэкендов с его участием.

Основы GraphQL простыми словами

GraphQL (Graph Query Language) — язык запросов и спецификация для API, созданные компанией Facebook* (принадлежит компании Meta, деятельность которой запрещена в России как экстремистская) в 2012 году и официально представленные в 2015 году. Система была разработана для решения конкретных проблем команды FB при проектировании мобильных приложений.

Представьте ситуацию: вы разрабатываете мобильное приложение и вам нужно показать профиль пользователя с его именем, фотографией, последними тремя постами и количеством друзей. При использовании традиционного REST API вам потребовалось бы сделать несколько запросов: один для получения информации о пользователе, другой для его постов, третий для списка друзей. Каждый запрос может вернуть избыточную информацию, которая вам не нужна, что приводит к лишнему расходу трафика и замедлению работы приложения.

В отличие от традиционных методов, клиенты, используя GraphQL, могут точно указать, какие данные им необходимы. Это похоже на заказ в ресторане, где вместо фиксированного набора блюд (как в REST) вы можете выбрать желаемые ингредиенты.

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

Для GraphQL характерны:

  • единая точка входа: все запросы, как правило, направляются на один endpoint;
  • декларативная природа: клиент описывает структуру желаемого ответа;
  • иерархическая структура: запросы имеют древовидную структуру — возможно запрашивать связанные данные;
  • сильная типизация: каждое поле имеет определенный тип.

Надо понимать, что GraphQL — не БД и не хранилище данных. Это слой между клиентом и источниками данных, позволяющий эффективно организовать взаимодействие. GraphQL может работать с любыми источниками: реляционными и NoSQL БД, файлами, другими API, микросервисами и статическими данными.

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

Основы GraphQL простыми словами

Image by rawpixel.com on Freepik.

Чем GraphQL отличается от REST

REST (Representational State Transfer) длительное время был стандартом разработки APIs. У GraphQL имеется несколько принципиальных отличий от него:

  1. Один endpoint вместо множества: в REST у каждого ресурса есть свой URL, а в GraphQL все запросы направляются на один endpoint.
  2. Запрос только нужных данных: REST часто возвращает избыточную информацию, GraphQL способен запросить ровно то, что требуется, не более и не менее.
  3. Уменьшение числа запросов: в REST для получения связанных данных (related data) обычно применяется несколько последовательных запросов. GraphQL способен выдать весь набор данных в ответ на один запрос.
  4. Строгая типизация: помогает избежать ошибок при разработке.
  5. Версионирование: для REST APIs обычно необходимо версионирование (например, /api/v1/, /api/v2/), а GraphQL может эволюционировать без необходимости создания новых версий за счет добавления новых полей и типов.

Главное отличие — в подходе к получению данных. В REST для загрузки сведений, например, о пользователе и его друзьях в соцсети, вам придется делать несколько запросов к разным эндпойнтам. В GraphQL, как мы уже отметили, вы получите все в ответ на единственный запрос, просто указав в нём нужные поля. Это значимо, в первую очередь, для мобильных приложений, где важно минимизировать трафик.

Как устроен GraphQL

Чтобы эффективно использовать GraphQL, необходимо понимать его «анатомию» — разберём основные компоненты на реальных примерах.

Схема и типы данных

Работа с GraphQL основывается на схеме (Schema) — она определяет, какие данные можно запросить у сервера, какие операции разрешены, как связаны между собой её сущности.

Схема строится на системе типов. Основные из них:

  1. Скалярные (Int, Float, String, Boolean, ID) — базовые «кирпичики» данных.
  2. Объектные — определяют сущности (например, User или Post).
  3. Специальные — Query, Mutation, Subscription.

Пример схемы на GraphQL Schema Definition Language (SDL):


type User {
id: ID!
  	name: String!
  	email: String
  	posts: [Post!]!
}
type Post {
  	id: ID!
  	title: String!
  	content: String!
  	author: User!
}
type Query {
  getUser(id: ID!): User
 	  allPosts: [Post!]!
}
            

Здесь:

  • ! означает, что поле обязательное;
  • [Post!]! — массив постов, который не может быть null и не может содержать null-элементы.

Запросы (Query)

Позволяют клиенту получать данные с сервера. Клиенты формируют запросы в соответствии со схемой, указывая, какие поля они хотят получить. Формат Query простой и лаконичный — запросы легко читаемы и понятны.

Пример запроса может выглядеть следующим образом:


query {
  users {
    name
    email
  }
}
            

Сервер вернет только имена и email пользователей, минимизируя объем передаваемых данных.

Особенности Query:

  1. Можно запрашивать связанные данные в одном запросе.
  2. Поддержка переменных (например, $userId).
  3. Чёткая структура ответа повторяет структуру запроса.

Мутации (Mutation)

Используются для изменения данных (создание, обновление, удаление). Их ключевые особенности:

  1. Всегда начинаются с mutation.
  2. Могут возвращать изменённые данные.
  3. Выполняются последовательно (в отличие от queries).

Пример для создания поста:


mutation CreatePost($input: PostInput!) {
  createPost(input: $input) {
    id
    title
    author {
      name
    }
    createdAt
  }
}
            

Где переменная $input может содержать:

json:


{
  "input": {
    "title": "Мой первый пост",
    "content": "Graph QL — это потрясающе!",
    "authorId": "123"
  }
}
            

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

Подписки (Subscription)

Это механизм реактивных обновлений через WebSocket. Они:

  1. Позволяют получать данные в реальном времени.
  2. Используются для чатов, уведомлений, live-данных.
  3. Работают поверх pub-sub системы.

Пример подписки на новые комментарии:


subscription OnNewComment($postId: ID!) {
  commentAdded(postId: $postId) {
    id
    text
    author {
      name
      avatar
    }
    createdAt
  }
}
            

Как это работает:

  1. Клиент подписывается на событие.
  2. Сервер отправляет первоначальные данные.
  3. При каждом новом событии (например, добавлении комментария) сервер «пушит» обновление.

В отличие от REST, где каждый эндпоинт отвечает за свою часть логики, GraphQL использует единую точку входа.

Как работает GraphQL на сервере

Сервер принимает клиентские запросы, парсит их, проверяет соответствие схеме и возвращает нужные данные, используя специальный движок — например, Apollo Server или Express GraphQL. На сервере должны работать так называемые resolvers — функции, определяющие, как именно будут извлекаться данные.

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

Рассмотрим, когда GraphQL действительно стоит использовать, а когда лучше рассмотреть альтернативы.

Основные преимущества GraphQL:

  1. Точечное получение данных (No Overfetching). Клиент сам определяет, какие поля ему нужны.

    Пример:

    
    # Запрашиваем только имя пользователя
    query {
      user(id: 1) {
        name
      }
    }
                        

    Сервер вернёт только {"name": "Alex"} (если имя, к примеру, ­— Alex), а не весь профиль с email, аватаром и историей заказов.

  2. Объединение данных из разных источников (Single Request). Один запрос может собрать все необходимые данные.

    Пример:

    
    query {
      user(id: 1) {
        name
        orders {
          id
          total
        }
      }
    }
                        
  3. Гибкость для клиентов.

    • мобильные приложения получают только нужные данные (экономия трафика);
    • фронтенд может менять запросы без изменений на бэкенде;
    • поддержка устаревших версий API через добавление полей (без версионирования).

Тем не менее, в работе GraphQL возникают и трудности:

  1. Сложность кэширования: в отличие от REST, для кэширования в GraphQL нужны дополнительные усилия из-за использования одного endpoint-а.
  2. Потенциальные проблемы производительности: сложные запросы могут стать причиной перегрузки сервера, если не реализована правильная защита от таких запросов.
  3. Сложность реализации: начальная настройка GraphQL более трудоемка в сравнении с REST.
  4. Неэффективность для простых APIs: для простых API с небольшим количеством ресурсов GraphQL скорее всего будет избыточным решением.
  5. Проблема N+1 запросов: без корректной оптимизации GraphQL может генерировать множество запросов к БД вместо одного.

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

Рассмотрим конкретные сценарии, где GraphQL раскрывает свой потенциал, и ситуации, в которых классический REST остаётся предпочтительным выбором.

Для каких проектов GraphQL особенно полезен

Выбор GraphQL целесообразен при следующих обстоятельствах:

  1. Сложные интерфейсы с разнородными данными: приложения, отображающие различные типы данных на одном экране, могут значительно выиграть от возможности получать необходимые данные одним запросом.
  2. Мобильные приложения: экономия трафика и уменьшение количества запросов особенно значимы для мобильных устройств с ограниченной пропускной способностью.
  3. Микросервисная архитектура: GraphQL может выступать в качестве объединяющего слоя (BFF — Backend for Frontend) для нескольких микросервисов.
  4. Быстро меняющиеся требования к API: если спецификации часто меняются, GraphQL позволяет адаптироваться без создания новых версий API.
  5. Проекты с несколькими клиентами: когда разные клиенты (веб, мобильные, внешние интеграции) нуждаются в различных данных.

В каких случаях REST проще и эффективнее

REST будет подходящим решением в следующих ситуациях:

  1. Простые CRUD-операции: для базовых операций создания, чтения, обновления и удаления с минимальным количеством ресурсов REST может быть проще в реализации.
  2. Публичные APIs с высокими требованиями к кэшированию: благодаря своей структуре, REST легко интегрируется с существующими системами кэширования HTTP.
  3. Простые сервисы с ограниченным набором операций: если API предоставляет доступ к небольшому количеству ресурсов с четко определенными операциями, REST может быть предпочтительнее.
  4. Системы с ограниченными ресурсами: в некоторых случаях накладные расходы на обработку и парсинг запросов GraphQL могут быть неоправданными.
  5. Проекты с жесткими требованиями к стабильности API: если неизменность API будет обеспечена в течение длительного времени, строгая структура REST может быть преимуществом.

Заключение

Если вы всё ещё не уверены, нужен ли вам GraphQL, задайте себе два вопроса:

  1. Часто ли ваши клиенты получают лишние данные?
  2. Требуется ли вам агрегация данных из нескольких источников?

Если есть ответ «да» хотя бы на один вопрос, стоит попробовать GraphQL в действии.

Автор: Макхост

Оцените статью

Основы GraphQL простыми словами Чем GraphQL отличается от REST Как устроен GraphQL Схема и типы данных Запросы (Query) Мутации (Mutation) Подписки (Subscription) Как работает GraphQL на сервере Преимущества и подводные камни GraphQL Когда стоит использовать GraphQL Для каких проектов GraphQL особенно полезен В каких случаях REST проще и эффективнее Заключение

Другие полезные статьи

Макхост — лидер авторитетных рейтингов