Введение
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:
- Overfetching: иногда мы получаем больше данных, чем нужно. Например, при запросе
/usersсервер может вернуть кучу полей (адрес, телефон, социальные сети), хотя нам нужен толькоnameилиemail. - Underfetching: мы можем получить недостаточно данных, и приходится делать дополнительные запросы. Например, сначала мы запрашиваем
/users, а потом отдельно для каждого пользователя/users/:id/details. - Множество запросов: в сложных приложениях количество запросов может вырасти экспоненциально.
Как GraphQL решает эти проблемы:
- GraphQL позволяет клиенту запрашивать только те данные, которые ему действительно нужны.
- Нужные данные можно запросить за один запрос, даже если они сложные и вложенные.
- Поддержка гибкости: структура ответа формируется запросом.
Вот простой пример:
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 активно используется в крупных компаниях. Вот несколько реальных кейсов:
- Facebook: так как GraphQL был создан Facebook, его использовали для упрощения работы с огромными объёмами данных в веб- и мобильных приложениях.
- GitHub: переход на GraphQL API позволил разработчикам GitHub получать сложные данные об организациях, репозиториях и пользователях с меньшим количеством запросов.
- Shopify: используют GraphQL API для управления магазинами, заказами и продуктами, обеспечивая магазинам гибкость в запросах.
Почему GraphQL стал популярным:
- Удобство для разработчиков: одно API — меньше путаницы.
- Повышение производительности серверов: серверы обрабатывают только те данные, которые были запрошены.
- Подходит для мобильных устройств: экономия трафика благодаря адаптивным запросам.
Сравнение REST и GraphQL: таблица
| Область | REST | GraphQL |
|---|---|---|
| Количество эндпоинтов | Много (по одному для каждого ресурса) | Один |
| Избыточность данных | Возможна (overfetching/underfetching) | Клиенты запрашивают только нужные данные |
| Работа с вложенными данными | Несколько запросов | Одна операция (вложенные структуры поддерживаются) |
| Документирование | Часто вручную | Встроенная документация через схему |
| Запросы в реальном времени | Нет | Поддерживаются через подписки (subscriptions) |
Практическое применение
GraphQL полезен в следующих ситуациях:
- Если API поддерживает множество клиентов с разными потребностями в данных (например, веб, мобильное приложение).
- Когда важно экономить ресурсы (трафик, количество запросов).
- Для работы над проектами, где сложные структуры данных и вложенные модели.
При этом, REST API всё ещё остаётся полезным в простых проектах. Как говорится, "Каждой технологии своё время".
На следующей лекции мы установим и настроим Apollo Client, чтобы начать взаимодействие с GraphQL-сервером. Запаситесь кофе, впереди много интересного!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ