← Назад к вопросам

Что такое 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)

Три основные операции

  1. Query — чтение данных (аналог GET в REST)
  2. Mutation — изменение данных (аналог POST/PUT/DELETE)
  3. 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 приложений
  • Когда нужна максимальная производительность
  • Кеширование критично