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

Ниже коротко разберем, что именно предлагает GraphQL, чем он отличается от REST и с каких частей удобнее начинать знакомство, чтобы не изучать технологию в отрыве от реальной задачи.

Что такое GraphQL

GraphQL - это язык запросов для API, а также среда для выполнения этих запросов с существующими данными. Он даёт клиентам (браузерам) возможность запросить у сервера только то, что нужно, и возвращает только запрошенные данные.

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

Запрос данных в GraphQL vs REST

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

Язык определения схемы - Schema Definition Language (SDL)

Схема — ядро любого GraphQL-проекта. Она определяет все операции, доступные клиенту: какие типы существуют, какие поля можно запросить и как они связаны между собой. GraphQL описывает схему через универсальный синтаксис — язык определения схемы (SDL). Основой схемы служат типы объектов: они описывают сущности, которые можно получить с сервера. Например:

type Movie {
  title: String
  Director: Director
}

type Director {
  name: String
  movies: [Movie]
}

Query - это базовая операция fetch в GraphQL для запроса данных с сервера GraphQL.

type Query {
  getMovies: [Movie]
  getDirectors: [Director]
}

Mutation - это одна из основных операций GraphQL, позволяющая манипулировать данными (создавать, изменять или удалять):

type Mutation {
  addMovie(title: String, director: String): Movie
}

Если ты хочешь узнать больше о SDL, официальный сайт GraphQL - то, что тебе нужно.

Первые шаги с GraphQL

Чтобы узнать больше о GraphQL, - то лучше всего попробовать его самому. GraphQL Editor - отличный вариант для рассмотрения. Этот инструмент пригодится тебе, когда начнешь изучать GraphQL, поскольку ты сможешь работать со своей схемой GraphQL в визуальном интерфейсе (конечно, можешь написать и код). GraphQL Editor предоставляет множество полезных функций, которые помогут тебе убедиться, что твой GraphQL API хорошо разработан.

Для новичков в GraphQL есть встроенный интерактивный учебник. Нажми на эту ссылку, и ты будешь перенаправлен на интерактивный учебник GraphQL.

GraphQL Editor предоставляет более простое:

  • Создание схемы - GraphQL Editor - это среда для разработки GraphQL, где ты можешь создать прототип своей схемы с визуальными узлами и проверить её. Параллельно создается традиционный код, поэтому ты можешь сделать это обоими способами.
  • Управление. - Редактор обеспечивает автоматизацию твоего проекта GraphQL; ты можешь импортировать уже существующую производственную схему, редактировать ее и генерировать фальшивый бэкэнд. Таким образом, можно протестировать новые функции даже без полностью работающего бэкенда!
  • Библиотеки автозаполнения для твоего интерфейса. Если JavaScript / TypeScript входит в число предпочитаемых тобой языков, ты можешь экспортировать библиотеки автозаполнения для своего проекта, основанные на graphql-zeus.
  • Совместная работа. Визуальное представление схемы улучшает взаимодействие между разработчиками и людьми с бизнес-ролями в команде.

Итог

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