GraphQL библиотека на C++: реализация API с помощью graphql-cpp

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

GraphQL библиотека для C++: graphql-cpp

В мире современных веб-технологий GraphQL стал стандартом для построения гибких и эффективных API. Если вы разрабатываете на C++ и хотите внедрить поддержку этого протокола, вам потребуется надёжная библиотека. Одним из лучших решений является graphql-cpp — библиотека с открытым исходным кодом, которая позволяет создавать полноценные GraphQL серверы на C++ с минимальными усилиями.

Что такое graphql-cpp?

graphql-cpp — это легковесная, но мощная библиотека, реализующая спецификацию GraphQL (июнь 2018) на C++14 и выше. Она предоставляет все необходимые компоненты: парсер запросов, систему типов, механизм выполнения запросов и поддержку подписок. Библиотека не зависит от сторонних HTTP-фреймворков, что позволяет интегрировать её в любой проект — от встраиваемых систем до высоконагруженных серверов.

Ключевые возможности

  • Полная поддержка схемы GraphQL: объекты, интерфейсы, union-типы, enum, скаляры и input-типы.
  • Валидация и выполнение запросов: встроенный валидатор и исполнитель с поддержкой сложных запросов, фрагментов и директив.
  • Поддержка подписок (Subscriptions): реализация через реактивные потоки.
  • Настраиваемые резолверы: гибкая система для привязки бизнес-логики к полям схемы.
  • Совместимость с C++17/20: использование современных возможностей языка для максимальной производительности.
  • Отсутствие зависимостей: не требует Boost, POCO или других внешних библиотек.

Установка и подключение

Библиотека распространяется как header-only (заголовочные файлы). Для установки склонируйте репозиторий:

git clone https://github.com/your-repo/graphql-cpp.git
cd graphql-cpp
mkdir build && cd build
cmake ..
make
sudo make install

В вашем проекте достаточно подключить один заголовочный файл:

#include <graphqlcpp/GraphQL.h>

Пример: создание простого API

Рассмотрим создание схемы для получения информации о пользователях.

1. Определение схемы

using namespace graphqlcpp;

auto schema = Schema::create(R"(
    type Query {
        user(id: ID!): User
        users: [User]
    }
    type User {
        id: ID!
        name: String!
        email: String
    }
)");

2. Реализация резолверов

// Пример хранилища данных
std::map<std::string, User> users = {
    {"1", {"1", "Alice", "alice@example.com"}},
    {"2", {"2", "Bob", "bob@example.com"}}
};

// Резолвер для поля user
schema->addResolver("Query", "user", [](const ResolverArgs& args) {
    auto id = args.getArgument<std::string>("id");
    if (users.count(id)) return users[id];
    return nullptr; // null, если пользователь не найден
});

// Резолвер для поля users
schema->addResolver("Query", "users", [](const ResolverArgs&) {
    std::vector<User> result;
    for (const auto& [_, user] : users) {
        result.push_back(user);
    }
    return result;
});

3. Обработка запроса

std::string query = R"(
    {
        user(id: "1") {
            name
            email
        }
    }
)";

auto result = schema->execute(query);
std::cout << result.dump(2) << std::endl;

Вывод:

{
  "data": {
    "user": {
      "name": "Alice",
      "email": "alice@example.com"
    }
  }
}

Преимущества для образовательного сайта

  • Понятная документация: библиотека имеет подробные комментарии в коде и примеры для каждого типа.
  • Низкий порог входа: для начала работы достаточно знать основы C++ и базовые концепции GraphQL.
  • Активное сообщество: библиотека поддерживается и обновляется, есть примеры интеграции с популярными HTTP-серверами (CPPREST SDK, Pistache).

Заключение

graphql-cpp — это идеальный выбор для изучения GraphQL на C++. Благодаря header-only архитектуре и отсутствию зависимостей, она легко встраивается в учебные проекты. С её помощью студенты могут на практике освоить создание схем, написание резолверов

Рекомендаций