JavaRush /Курсы /Модуль 3: React /Основные концепции GraphQL — отличие от REST, преимуществ...

Основные концепции GraphQL — отличие от REST, преимущества

Модуль 3: React
12 уровень , 0 лекция
Открыта

Введение

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

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

Основные возможности GraphQL:

  • Запросы (Query) — позволяют извлекать данные с сервера.
  • Мутации (Mutation) — используются для изменения данных (создание, обновление, удаление).
  • Подписки (Subscriptions) — обеспечивают возможность подписываться на обновления данных в реальном времени.

GraphQL разрабатывался как альтернатива REST API, чтобы решить некоторые его ограничения. Давайте разберёмся подробнее.

Отличие GraphQL от REST

REST — это стандарт для построения API, который организует данные в виде URL-ресурсов. Каждый URL возвращает предопределённый набор данных. GraphQL подходит иначе: вместо множества ресурсов существует единая точка входа (endpoint), где клиенты могут запрашивать необходимые данные, определяя их структуру в запросе.

Проблемы REST:

  1. Overfetching: иногда мы получаем больше данных, чем нужно. Например, при запросе /users сервер может вернуть кучу полей (адрес, телефон, социальные сети), хотя нам нужен только name или email.
  2. Underfetching: мы можем получить недостаточно данных, и приходится делать дополнительные запросы. Например, сначала мы запрашиваем /users, а потом отдельно для каждого пользователя /users/:id/details.
  3. Множество запросов: в сложных приложениях количество запросов может вырасти экспоненциально.

Как GraphQL решает эти проблемы:

  1. GraphQL позволяет клиенту запрашивать только те данные, которые ему действительно нужны.
  2. Нужные данные можно запросить за один запрос, даже если они сложные и вложенные.
  3. Поддержка гибкости: структура ответа формируется запросом.

Вот простой пример:

REST API:

GET /users

Ответ сервера:

[
  {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com",
    "phone": "123-456"
  },
  {
    "id": 2,
    "name": "Bob",
    "email": "bob@example.com",
    "phone": "789-012"
  }
]

GraphQL:

query {
  users {
    name
    email
  }
}

Ответ сервера:

{
  "data": {
    "users": [
      {
        "name": "Alice",
        "email": "alice@example.com"
      },
      {
        "name": "Bob",
        "email": "bob@example.com"
      }
    ]
  }
}

Плюсы GraphQL:

  • Экономия ресурсов: запрашиваем только нужные данные.
  • Единая точка входа: нет необходимости помнить множество эндпоинтов.
  • Сложные структуры данных: можно легко запрашивать вложенные данные.
  • Документация из коробки: GraphQL API самодокументируемый.

Основные концепции GraphQL

1. Схема

Сердце GraphQL — это схема. Она описывает, какие данные доступны для запросов, какие операции разрешены и какие типы существуют.

Пример схемы:

type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  users: [User!]!
}

type Mutation {
  addUser(name: String!, email: String!): User!
}

Здесь мы описали:

  • Тип User с обязательными полями id, name и email.
  • Запрос users, который возвращает массив пользователей.
  • Мутацию addUser, которая принимает name и email и возвращает нового пользователя.

2. Запросы (Query)

Запросы используют схему для получения данных. Вот пример запроса:

query {
  users {
    id
    name
  }
}

В ответе будет только то, что мы запросили:

{
  "data": {
    "users": [
      {"id": "1", "name": "Alice"},
      {"id": "2", "name": "Bob"}
    ]
  }
}

3. Мутации (Mutation)

Мутации используются для изменения данных. Пример:

mutation {
  addUser(name: "Charlie", email: "charlie@example.com") {
    id
    name
  }
}

Ответ:

{
  "data": {
    "addUser": {
      "id": "3",
      "name": "Charlie"
    }
  }
}

4. Подписки (Subscriptions)

Подписки позволяют клиенту получать обновления в реальном времени. Например, обновление чата:

subscription {
  messageAdded {
    id
    content
    sender
  }
}

Примеры использования GraphQL в реальных проектах

GraphQL активно используется в крупных компаниях. Вот несколько реальных кейсов:

  1. Facebook: так как GraphQL был создан Facebook, его использовали для упрощения работы с огромными объёмами данных в веб- и мобильных приложениях.
  2. GitHub: переход на GraphQL API позволил разработчикам GitHub получать сложные данные об организациях, репозиториях и пользователях с меньшим количеством запросов.
  3. Shopify: используют GraphQL API для управления магазинами, заказами и продуктами, обеспечивая магазинам гибкость в запросах.

Почему GraphQL стал популярным:

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

Сравнение REST и GraphQL: таблица

Область REST GraphQL
Количество эндпоинтов Много (по одному для каждого ресурса) Один
Избыточность данных Возможна (overfetching/underfetching) Клиенты запрашивают только нужные данные
Работа с вложенными данными Несколько запросов Одна операция (вложенные структуры поддерживаются)
Документирование Часто вручную Встроенная документация через схему
Запросы в реальном времени Нет Поддерживаются через подписки (subscriptions)

Практическое применение

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

  • Если API поддерживает множество клиентов с разными потребностями в данных (например, веб, мобильное приложение).
  • Когда важно экономить ресурсы (трафик, количество запросов).
  • Для работы над проектами, где сложные структуры данных и вложенные модели.

При этом, REST API всё ещё остаётся полезным в простых проектах. Как говорится, "Каждой технологии своё время".

На следующей лекции мы установим и настроим Apollo Client, чтобы начать взаимодействие с GraphQL-сервером. Запаситесь кофе, впереди много интересного!

1
Задача
Модуль 3: React, 12 уровень, 0 лекция
Недоступна
Создание базовой схемы GraphQL
Создание базовой схемы GraphQL
1
Задача
Модуль 3: React, 12 уровень, 0 лекция
Недоступна
Написание первого GraphQL-запроса
Написание первого GraphQL-запроса
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ