← Назад к вопросам
Что такое GraphQL?
2.0 Middle🔥 111 комментариев
#REST API и HTTP#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
GraphQL
GraphQL — это язык запросов и runtime для APIs (Application Programming Interfaces). Он предоставляет декларативный способ запрашивать данные, в отличие от REST, где клиент получает фиксированную структуру данных от сервера.
Основные отличия от REST
В REST:
- Сервер определяет структуру ответа:
GET /users/123вернёт всё, что есть в БД - Если нужны дополнительные данные (посты пользователя, комментарии) — нужны отдельные запросы (over-fetching)
- Если не нужны все поля — получаешь лишние данные (under-fetching)
В GraphQL:
- Клиент сам определяет, какие поля ему нужны
- Один запрос может получить все нужные данные с разных "таблиц"
- Нет over/under-fetching
Как это выглядит
# Запрос в GraphQL
query GetUserWithPosts {
user(id: "123") {
id
name
email
posts {
id
title
createdAt
}
}
}
Вместо двух REST запросов (GET /users/123 и GET /users/123/posts) здесь один GraphQL запрос.
Архитектура GraphQL
# На Python используем graphene или strawberry
from graphene import ObjectType, String, List, Field
class User(ObjectType):
id = String()
name = String()
email = String()
posts = List(lambda: Post)
def resolve_posts(self, info):
# Выполнить запрос к БД
return Post.objects.filter(user_id=self.id)
class Post(ObjectType):
id = String()
title = String()
content = String()
class Query(ObjectType):
user = Field(User, id=String(required=True))
def resolve_user(self, info, id):
return User.objects.get(id=id)
schema = graphene.Schema(query=Query)
Три основные операции
- Query — чтение данных (аналог GET в REST)
- Mutation — изменение данных (аналог POST/PUT/DELETE)
- Subscription — real-time обновления (вебсокеты)
class CreatePost(graphene.Mutation):
class Arguments:
title = graphene.String(required=True)
content = graphene.String()
post = graphene.Field(Post)
@staticmethod
def mutate(root, info, title, content):
post = Post(title=title, content=content)
post.save()
return CreatePost(post=post)
class Mutation(ObjectType):
create_post = CreatePost.Field()
Преимущества GraphQL
- Точность данных — клиент получает ровно то, что запросил
- Меньше запросов — вложенные данные в одном запросе
- Самодокументируемость — schema служит документацией
- Инструменты — GraphiQL для тестирования и отладки
- Типизация — строгая типизация данных
Недостатки
- Сложность на сервере — нужно реализовать правильную резолюцию данных
- N+1 проблема — если неправильно реализовать, может быть много DB запросов
- Кеширование — HTTP-кеширование работает хуже (все запросы идут на один URL)
- Обучение — команда должна понимать GraphQL концепции
Когда использовать
GraphQL хорош для:
- Мобильных приложений (экономия трафика)
- APIs с вариативными клиентами (web, mobile, desktop)
- Микросервисной архитектуры (БФ (backend for frontend))
REST всё ещё лучше для:
- Простых CRUD приложений
- Когда нужна максимальная производительность
- Кеширование критично