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

Что делает GraphQL?

1.3 Junior🔥 151 комментариев
#REST API и микросервисы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что делает GraphQL?

GraphQL — это язык запросов (query language) и среда выполнения (runtime) для работы с API. Вместо традиционного REST API, GraphQL позволяет клиентам запрашивать ровно те данные, которые им нужны, ничего больше и ничего меньше. Это современная альтернатива REST, разработанная Facebook, которая решает множество проблем, присущих REST API.

Основные функции GraphQL

  1. Запросы данных — клиент указывает, какие данные ему нужны
  2. Типизация — каждое поле имеет чёткий тип данных
  3. Единая точка доступа — один endpoint вместо множества REST endpoints
  4. Внутренняя оптимизация — сервер может оптимизировать выполнение запроса

GraphQL vs REST

REST запрос (неэффективный):

GET /api/users/1              // получить пользователя
GET /api/users/1/posts        // получить посты
GET /api/users/1/comments     // получить комментарии

GraphQL запрос (один запрос на всё):

query {
  user(id: 1) {
    name
    email
    posts {
      title
      body
    }
    comments {
      text
    }
  }
}

Архитектура GraphQL

GraphQL состоит из трёх основных частей:

  1. Schema — описание типов данных и доступных операций
  2. Resolver — функции, которые возвращают данные для каждого поля
  3. Query Engine — механизм выполнения запросов

Пример Schema на Java (GraphQL-Java)

import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLField;
import graphql.schema.GraphQLArgument;

import static graphql.Scalars.*;

GraphQLObjectType queryType = GraphQLObjectType.newObject()
    .name("Query")
    .field(GraphQLField.newFieldDefinition()
        .name("user")
        .type(GraphQLObjectType.newObject()
            .name("User")
            .field(GraphQLField.newFieldDefinition()
                .name("id")
                .type(GraphQLInt)
                .build())
            .field(GraphQLField.newFieldDefinition()
                .name("name")
                .type(GraphQLString)
                .build())
            .build())
        .argument(GraphQLArgument.newArgument()
            .name("id")
            .type(GraphQLInt)
            .build())
        .dataFetcher(env -> {
            Integer userId = env.getArgument("id");
            return getUserById(userId); // Resolver функция
        })
        .build())
    .build();

Операции в GraphQL

  • Query — чтение данных (как GET в REST)
  • Mutation — изменение данных (как POST/PUT/DELETE в REST)
  • Subscription — подписка на изменения в реальном времени

Пример Mutation

mutation {
  createUser(name: "John", email: "john@example.com") {
    id
    name
    email
  }
}

Resolver в Java

DataFetcher<User> userDataFetcher = env -> {
    Integer userId = env.getArgument("id");
    // Получить пользователя из БД
    return userService.findById(userId);
};

DataFetcher<List<Post>> postsDataFetcher = env -> {
    User user = env.getSource();
    // Получить посты для пользователя
    return postService.findByUserId(user.getId());
};

Преимущества GraphQL

  • Точность данных — получаешь только то, что запросил
  • Меньше network traffic — не загружаются лишние поля
  • Сильная типизация — ошибки выявляются до выполнения
  • Самодокументирующийся — schema служит документацией
  • Версионирование — не нужны /v1/, /v2/ endpoints
  • Инструменты — GraphiQL, Playground для тестирования

Недостатки GraphQL

  • Сложность кэширования — один URL, разные запросы
  • N+1 problem — нужно оптимизировать load-ы
  • Кривая обучения — сложнее чем REST для новичков
  • Безопасность — нужно защищать от больших запросов (depth limit)

Инструменты для Java

  • GraphQL-Java — основная библиотека
  • Spring GraphQL — интеграция с Spring
  • Apollo Client — клиент-сторона (JavaScript)
  • DataLoader — оптимизация batch запросов

Вывод: **GraphQL — это современное решение для API, которое позволяет клиентам запрашивать ровно те данные, которые им нужны, обеспечивая типизацию, гибкость и эффективность.

Что делает GraphQL? | PrepBro