GraphQL en C++: biblioteca cppgraphqlgen para crear API

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

Biblioteca GraphQL C++: cppgraphqlgen



cppgraphqlgen es una biblioteca moderna en C++ para implementar la parte del servidor de GraphQL. Permite a los desarrolladores crear API tipográficamente seguras, rápidas y escalables, aprovechando las ventajas de la tipificación estática de C++. La biblioteca genera código basado en el esquema GraphQL (archivos .graphql), lo que minimiza la escritura manual de resolvers y reduce la probabilidad de errores.



Características principales

  • Generación de código a partir del esquema — se introduce un archivo schema.graphql y se obtienen clases y funciones de C++.
  • Seguridad de tipos — todos los tipos GraphQL (String, Int, Float, Boolean, ID, Enum, Input, Object) se compilan en los tipos C++ correspondientes.
  • Soporte para suscripciones (Subscriptions) — implementado a través de WebSocket y flujos asíncronos.
  • Validación de consultas — verificación incorporada de la sintaxis y semántica de las consultas GraphQL.
  • Integración con HTTP — funciona sobre cualquier servidor HTTP de C++ (por ejemplo, beast de Boost).
  • Soporte para directivas — directivas personalizadas para ampliar la funcionalidad.


Instalación

Para instalar cppgraphqlgen se requiere un compilador compatible con C++17 y el sistema de compilación CMake. Instalación a través de vcpkg o compilación desde el código fuente:

# A través de vcpkgvcpkg install cppgraphqlgen

# Compilación desde el repositoriogit clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target install


Ejemplo de uso

Consideremos un ejemplo simple: crearemos un esquema GraphQL para obtener información sobre un usuario y un libro. Primero, definimos el esquema schema.graphql:

type Query {  user(id: ID!): User  book(id: ID!): Book}

type User { id: ID! name: String! email: String}

type Book { id: ID! title: String! author: String!}


Después de generar el código (comando graphqlgen), obtenemos el archivo Generated.h. Ahora escribimos los resolvers en C++:

#include "Generated.h"#include <unordered_map>

// Datos de ejemplo (en un proyecto real — BD)std::unordered_map<std::string, User> users = { {"1", {"1", "Alice", "alice@example.com"}}, {"2", {"2", "Bob", nullptr}}};

std::unordered_map<std::string, Book> books = { {"10", {"10", "C++ Primer", "Lippman"}}, {"20", {"20", "Effective Modern C++", "Meyers"}}};

// Resolver para Query.userUser resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}

// Resolver para Query.bookBook resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}


Ahora configuramos el servidor e iniciamos el procesamiento de consultas:

#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>

int main() { // Creamos el servicio con el esquema auto service = std::make_shared<graphql::service::GraphQLService>();

// Registramos los resolvers service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);

// Iniciamos el servidor HTTP (simplificado) http::server server("0.0.0.0", 8080, service); server.run();

return 0;}


Manejo de errores y validación

La biblioteca verifica automáticamente la corrección de las consultas entrantes. Si el resolver lanza una excepción, cppgraphqlgen la convierte en un error de GraphQL con el código correspondiente. Ejemplo de manejo:


                
    
    

Recommendations