GraphQL en C++: biblioteca cppgraphqlgen para API modernas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 utilidad graphqlgen crea 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:

  1. Generador de código (graphqlgen) — lee el esquema y crea archivos de cabecera con clases para cada tipo, interfaces para resolvers y funciones auxiliares.
  2. 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 install


Para 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 ./generated


Despué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"

Recommendations