GraphQL em C++: cppgraphqlgen — uma ferramenta poderosa para APIs modernas
GraphQL é uma linguagem de consulta para APIs que permite que os clientes obtenham apenas os dados necessários. Embora GraphQL seja mais frequentemente associado a JavaScript (Apollo, Relay) ou Python (Graphene, Strawberry), para sistemas de alta carga em C++ também existe uma excelente solução — a biblioteca cppgraphqlgen. Ela fornece um conjunto completo de ferramentas para criar a parte do servidor GraphQL em C++ puro com suporte aos padrões modernos C++17/20.
O que é cppgraphqlgen?
cppgraphqlgen é uma biblioteca header-only (com compilação opcional em .so/.dll) que implementa a especificação GraphQL (June 2018). Ela gera código type-safe com base no esquema (SDL — Schema Definition Language) e permite criar servidores GraphQL eficientes e multithread.
Principais características:
- Geração de código a partir do esquema — você descreve tipos, consultas e mutações em um arquivo
.graphql, e a ferramentagraphqlgencria classes C++. - Type-safety — todos os tipos são verificados em tempo de compilação. Sem erros de tipo em tempo de execução.
- Desempenho — overhead mínimo, suporte a resolvedores assíncronos (via
std::future). - Suporte a Subscriptions — via WebSocket ou gRPC.
- Integração com qualquer servidor HTTP — pode ser usado com
crow,drogon,beast(Boost.Asio) ou até mesmo com sua própria implementação.
Arquitetura da biblioteca
cppgraphqlgen consiste em duas partes:
- Gerador de código (
graphqlgen) — lê o esquema e cria arquivos de cabeçalho com classes para cada tipo, interfaces para resolvedores e funções auxiliares. - Biblioteca runtime — parser de consultas, validador, executor e serializador de respostas.
Instalação
A biblioteca é distribuída via vcpkg ou compilada a partir do código fonte:
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installPara usar o gerador, é necessário node.js (ele é escrito em TypeScript), mas o runtime é C++ puro.
Exemplo: criando um servidor GraphQL simples
Primeiro, crie o esquema schema.graphql:
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}Em seguida, execute o gerador:
graphqlgen --schema schema.graphql --output ./generatedDepois disso, na pasta generated, aparecerão os arquivos: SchemaTypes.h, SchemaResolver.h e outros. Agora, escreva os resolvedores:
#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"
class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Hello, GraphQL from C++!"); }
std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("John Doe"); user->email = std::make_shared<graphql::schema::String>("john@example.com"); return user; }};Agora, compile o servidor usando crow:
#include <crow.h>#include "generated/Schema.h"