API GraphQL en C++: tutorial paso a paso con ejemplos prácticos

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

Introducción: GraphQL y C++ — un dúo poderoso para API modernas

\n\n

GraphQL se está convirtiendo en el estándar de facto para construir API flexibles y eficientes. Mientras que la mayoría de los tutoriales se centran en JavaScript o Python, C++ sigue siendo indispensable para sistemas de alta carga, servidores de juegos y soluciones embebidas. En esta guía paso a paso, crearemos una API GraphQL completa en C++ desde cero, utilizando la biblioteca graphql-cpp y el servidor cpp-httplib.

\n\n

Aprenderá a configurar el entorno, definir el esquema, implementar resolvers e iniciar el servidor. Todos los ejemplos de código se pueden aplicar inmediatamente en proyectos reales.

\n\n

1. Preparación del entorno e instalación de dependencias

\n\n

Para trabajar necesitaremos:

\n
    \n
  • Compilador con soporte para C++17 (GCC 8+, Clang 7+, MSVC 2019+)
  • \n
  • CMake (versión 3.14+)
  • \n
  • Biblioteca graphql-cpp (implementación de GraphQL)
  • \n
  • Biblioteca cpp-httplib (servidor HTTP)
  • \n
  • Gestor de paquetes vcpkg (opcional, pero conveniente)
  • \n
\n\n

Instalación mediante vcpkg

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install graphql-cpp cpp-httplib nlohmann-json
\n\n

Estructura del proyecto

\n
graphql-cpp-api/\n├── CMakeLists.txt\n├── src/\n│   ├── main.cpp\n│   ├── schema.cpp\n│   ├── schema.h\n│   ├── resolvers.cpp\n│   └── resolvers.h\n└── vcpkg.json
\n\n

CMakeLists.txt

\n
cmake_minimum_required(VERSION 3.14)\nproject(GraphQLCppApi)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nfind_package(graphql-cpp CONFIG REQUIRED)\nfind_package(cpp-httplib CONFIG REQUIRED)\nfind_package(nlohmann_json CONFIG REQUIRED)\n\nadd_executable(graphql_server\n    src/main.cpp\n    src/schema.cpp\n    src/resolvers.cpp\n)\n\ntarget_link_libraries(graphql_server\n    graphql-cpp::graphql-cpp\n    cpp-httplib::cpp-httplib\n    nlohmann_json::nlohmann_json\n)
\n\n

Ahora todo está listo para escribir el código.

\n\n

2. Definición del esquema GraphQL y tipos

\n\n

Empecemos creando el esquema para una API simple de gestión de libros. Tendremos los tipos Book y Author, así como consultas y mutaciones.

\n\n

schema.h

\n
#ifndef SCHEMA_H\n#define SCHEMA_H\n\n#include <graphqlcpp/GraphQLSchema.h>\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema();\n\n#endif
\n\n

schema.cpp

\n
#include "schema.h"\n#include "resolvers.h"\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema() {\n    using namespace graphql;\n\n    // Tipo Author\n    auto authorType = object_type("Author", {\n        field("id", int_type()),\n        field("name", string_type()),\n        field("books", list_type(int_type()))\n    });\n\n    // Tipo Book\n    auto bookType = object_type("Book", {\n        field("id", int_type()),\n        field("title", string_type()),\n        field("authorId", int_type()),\n        field("year", int_type()),\n        field("genre", string_type())\n    });\n\n    // Query root\n    auto queryType = object_type("Query", {\n        field("books", list_type(bookType), {\n            argument("genre", string_type(), true)  // argumento opcional\n        }, resolveBooks),\n        field("book", bookType, {\n            argument("id", int_type(), false)       // argumento obligatorio\n        }, resolveBookById),\n        field("authors", list_type(authorType), resolveAuthors)\n    });\n\n    // Mutation root\n    auto mutationType = object_type("Mutation", {\n        field("addBook", bookType, {\n            argument("title", string_type(), false),\n            argument("authorId", int_type(), false),\n            argument("year", int_type(), false),\n            argument("genre", string_type(), false)\n        }, resolveAddBook),\n        field("deleteBook", bool_type(), {\n            argument("id", int_type(), false)\n        }, res                

Blogs

Book Recommendations