GraphQL был разработан в 2012 году компанией Facebook (да-да, теми самыми ребятами, которые подарили нам React, а также часы вечного дебага).
Основной проблемой, которую пытались решить, была перегрузка данных.
При использовании традиционных REST API часто приходится либо запрашивать слишком много данных (оверфетчинг — overfetching),
либо слишком мало (недофетчинг — underfetching), что ведёт к лишним HTTP-запросам.
Представьте ситуацию: вы запрашиваете список пользователей, но вам нужны только их имена,
а API возвращает всю информацию — адрес, почту и фотографию их кота. Это неэффективно.
GraphQL представляет собой язык запросов для API, который позволяет клиентам четко определять, какие именно данные они хотят получить.
В отличие от REST, где данные структурированы вокруг ресурсов и URL,
GraphQL организует данные вокруг схемы.
Официальная дата выпуска GraphQL для публичного использования — 2015 год.
С тех пор его применяют такие гиганты, как GitHub, Twitter и Airbnb.
Основные концепции GraphQL
- Схема и типизация данных
Сердце GraphQL — это схема (schema). Схема задаёт строгую типизацию данных, которые можно запрашивать. Например, типы для пользователя могут выглядеть так:
type User {
id: ID!
name: String!
email: String
age: Int
}
Всё строго типизировано. Если запрос не соответствует схеме, произойдет ошибка. Такой подход позволяет избежать неожиданных ошибок при использовании API.
- Гибкие запросы
GraphQL позволяет клиенту запросить только то, что ему нужно. Например, если интересуют только имя и возраст пользователя, запрос будет выглядеть так:
query {
user(id: 1) {
name
age
}
}
Ответ от сервера будет строго соответствовать структуре запроса:
{
"data": {
"user": {
"name": "Alice",
"age": 25
}
}
}
- Единая точка доступа
В REST API у нас часто есть множество URL-эндпоинтов: /users, /posts, /comments. В GraphQL всё решается через единую точку доступа, например: /graphql.
Преимущества использования GraphQL
- Преодоление оверфетчинга и недофетчинга
REST: Запрос данных о пользователе может вернуть:
- Имя
- Почту
- Адрес
- Кота...
GraphQL: Запрашиваем ровно то, что нужно:
query {
user(id: 1) {
name
email
}
}
- Гибкость и экономия времени
GraphQL позволяет комбинировать запросы. С REST API, чтобы получить данные пользователя и список его постов, нужно сделать два запроса:
GET /users/1
GET /users/1/posts
GraphQL объединит эти запросы в один:
query {
user(id: 1) {
name
posts {
title
}
}
}
Экономия запросов = экономия времени = довольный клиент.
- Схема как документация
GraphQL-схема автоматически описывает API, что упрощает разработку. Использование инструментов, таких как GraphiQL или GraphQL Playground, позволяет автоматически генерировать документацию.
- Реализация клиентоцентричной архитектуры
В мире REST API сервер диктует клиенту, какие данные и как получать. В GraphQL клиент сам решает, что ему нужно. Демократия данных, правда?
Сравнение GraphQL и REST
| Параметр | GraphQL | REST |
|---|---|---|
| Модель данных | Гибкая, клиент сам выбирает, какие данные нужны | Фиксированная, данные зависят от эндпоинта |
| Эффективность запросов | Один запрос может вернуть данные из разных сущностей | Часто требуется несколько запросов |
| Типизация | Сильно типизированный язык | Типизация зависит от реализации |
| Документация | Схема служит встроенной документацией | Требуется дополнительная документация, например Swagger |
| Точка входа | Единая точка (/graphql) |
Различные эндпоинты |
| Использование кэша | Кэширование сложное, особенно на уровне HTTP | Использует стандартное кэширование HTTP |
Когда использовать GraphQL?
- Если приложение требует частого взаимодействия между клиентом и сервером.
- Если приложение сильно завязано на отображение данных из нескольких источников (например, микро-сервисы).
- Если клиентам важно самостоятельно определить, какие данные получать.
Когда GraphQL не подходит?
- Если вы создаёте небольшое приложение с редкими запросами.
- Если у приложения фиксированные данные и их структура, которые не будут меняться.
Пример использования GraphQL в реальном приложении
Допустим, вы создаёте интернет-магазин. В REST API для получения информации о продукте и его отзывах вам нужно несколько запросов. В GraphQL вы сделаете это в один запрос:
query {
product(id: 1) {
name
price
reviews {
user {
name
}
comment
}
}
}
Ответ сервера:
{
"data": {
"product": {
"name": "MacBook Pro",
"price": 1500,
"reviews": [
{
"user": {
"name": "John"
},
"comment": "Отличный ноутбук!"
},
{
"user": {
"name": "Alice"
},
"comment": "Дорого, но стоит своих денег."
}
]
}
}
}
Эффективно, правда?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ