GraphQL en C++: cppgraphqlgen — una potente herramienta para API modernas
GraphQL es un lenguaje de consultas para API que permite a los clientes obtener solo los datos necesarios. Aunque GraphQL se asocia más a menudo con JavaScript (Apollo, Relay) o Python (Graphene, Strawberry), para sistemas de alto rendimiento en C++ también existe una excelente solución: la biblioteca cppgraphqlgen. Proporciona un conjunto completo de herramientas para crear la parte del servidor de GraphQL en C++ puro con soporte para los estándares modernos C++17/20.
¿Qué es cppgraphqlgen?
cppgraphqlgen es una biblioteca header-only (con compilación opcional en .so/.dll) que implementa la especificación de GraphQL (Junio 2018). Genera código type-safe basado en el esquema (SDL — Schema Definition Language) y permite crear servidores GraphQL eficientes y multiproceso.
Características clave:
- Generación de código a partir del esquema — describes tipos, consultas y mutaciones en un archivo
.graphql, y la utilidadgraphqlgencrea las clases de C++. - Type-safety — todos los tipos se verifican en tiempo de compilación. Sin errores de tipo en tiempo de ejecución.
- Rendimiento — gastos generales mínimos, soporte para resolvers asíncronos (a través de
std::future). - Soporte para suscripciones (Subscriptions) — a través de WebSocket o gRPC.
- Integración con cualquier servidor HTTP — se puede usar con
crow,drogon,beast(Boost.Asio) o incluso una implementación propia.
Arquitectura de la biblioteca
cppgraphqlgen consta de dos partes:
- Generador de código (
graphqlgen) — lee el esquema y crea archivos de cabecera con clases para cada tipo, interfaces para resolvers y funciones auxiliares. - Biblioteca de runtime — analizador de consultas, validador, ejecutor y serializador de respuestas.
Instalación
La biblioteca se distribuye a través de vcpkg o se compila desde el código fuente:
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installPara usar el generador se necesita node.js (está escrito en TypeScript), pero el runtime es C++ puro.
Ejemplo: creación de un servidor GraphQL simple
Primero, creamos el esquema schema.graphql:
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}Luego ejecutamos el generador:
graphqlgen --schema schema.graphql --output ./generatedDespués de esto, en la carpeta generated aparecerán los archivos: SchemaTypes.h, SchemaResolver.h y otros. Ahora escribimos los resolvers:
#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>("¡Hola, GraphQL desde 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>("Juan Pérez"); user->email = std::make_shared<graphql::schema::String>("juan@ejemplo.com"); return user; }};Ahora compilamos el servidor usando crow:
#include <crow.h>#include "generated/Schema.h"