API GraphQL con C++: tutorial paso a paso
GraphQL es un lenguaje de consultas para API, desarrollado por Facebook. A diferencia de REST, permite al cliente solicitar solo los datos que necesita, lo que reduce el volumen de información transferida y acelera el funcionamiento de las aplicaciones. En este tutorial crearemos un servidor GraphQL simple en C++ utilizando la biblioteca graphql-cpp. Aprenderá cómo definir un esquema, escribir resolvers y procesar consultas y mutaciones.
¿Qué es GraphQL y por qué C++?
GraphQL proporciona un único punto final para todas las consultas. Los conceptos principales son:
- Esquema (Schema) — descripción de los tipos de datos disponibles y las operaciones (consultas, mutaciones, suscripciones).
- Consultas (Queries) — operaciones de lectura de datos.
- Mutaciones (Mutations) — operaciones de escritura/modificación de datos.
- Resolvers — funciones que devuelven datos para cada campo.
C++ es un lenguaje potente para sistemas de alta carga. El uso de GraphQL con C++ permite crear API eficientes y escalables. La biblioteca graphql-cpp proporciona una interfaz conveniente para la integración.
Instalación y configuración del proyecto
Para trabajar necesitaremos:
- Compilador C++17 (por ejemplo, g++ o MSVC).
- Biblioteca
graphql-cpp(instalación mediante vcpkg o compilación desde el código fuente). - Servidor HTTP (usaremos
cpp-httplibpor simplicidad).
Instalación mediante vcpkg
vcpkg install graphql-cppvcpkg install cpp-httplibEstructura del proyecto
Cree los archivos:
main.cpp— punto de entrada y servidor HTTP.schema.hpp— definición del esquema GraphQL.resolvers.hpp— implementación de los resolvers.CMakeLists.txt— configuración de compilación.
Definición del esquema GraphQL
Crearemos un esquema simple para gestionar una lista de usuarios. El tipo User contiene los campos id, name y email. Consultas: users (lista de todos los usuarios) y user(id: ID!) (un usuario). Mutación: addUser(name: String!, email: String!): User.
En el archivo schema.hpp:
#ifndef SCHEMA_HPP#define SCHEMA_HPP
#include <graphqlcpp/GraphQLSchema.h>
using namespace graphqlcpp;
// Definimos el tipo Userauto userType = std::make_shared<ObjectType>( "User", { {"id", Type::NonNull(Type::ID)}, {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} });
// Definimos Queryauto queryType = std::make_shared<ObjectType>( "Query", { {"users", Type::List(Type::NonNull(userType))}, {"user", Type::NonNull(userType), {{"id", Type::NonNull(Type::ID)}}} });
// Definimos Mutationauto mutationType = std::make_shared<ObjectType>( "Mutation", { {"addUser", Type::NonNull(userType), { {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} }} });
// Armamos el esquemaauto schema = std::make_shared<Schema>(queryType, mutationType);
#endif // SCHEMA_HPPImplementación de los resolvers
Los resolvers son funciones que devuelven datos para cada campo. En nuestro ejemplo, los datos se almacenarán en un vector global. En el archivo resolvers.hpp:
#ifndef RESOLVERS_HPP#define RESOLVERS_HPP
#include <vector>#include <string>#include <graphqlcpp/Resolvers.h>
using namespace graphqlcpp;
struct User { std::string id; std::string name; std::string email;};
std::vector<User> users = { {"1", "