Introducción: ¿Por qué C++ para REST API?
C++ se asocia tradicionalmente con la programación de sistemas, juegos y aplicaciones de alta carga. Sin embargo, el C++ moderno (estándares C++17 y C++20) junto con bibliotecas ligeras permite crear servicios web rápidos y eficientes. Si necesitas una REST API que procese miles de solicitudes por segundo con latencia mínima, C++ es una excelente opción.
En este artículo crearemos en 30 minutos una REST API completa en C++ utilizando la biblioteca Crow. Es un mini-framework similar a Python Flask, pero escrito en C++. Configuraremos rutas, aprenderemos a parsear JSON y devolver respuestas.
Paso 1: Preparación del entorno e instalación de Crow
Para trabajar necesitaremos un compilador con soporte para C++17 (GCC 7+, Clang 5+, MSVC 2019+) y un gestor de dependencias vcpkg o Conan. La forma más sencilla es descargar Crow como archivo de cabecera (header-only).
1.1 Instalación mediante vcpkg (recomendado)
Si tienes instalado vcpkg, ejecuta el comando:
vcpkg install crowLuego, al compilar, indica la ruta a las bibliotecas:
g++ main.cpp -std=c++17 -I/path/to/vcpkg/installed/x64-linux/include -lpthread -o server1.2 Instalación manual (header-only)
Descarga la última versión de Crow desde GitHub. Solo necesitas el archivo crow_all.h (todo incluido). Colócalo en la carpeta del proyecto.
Paso 2: Creación de un servidor simple con dos endpoints
Escribamos un servidor mínimo que escuche en el puerto 8080 y responda a solicitudes GET y POST. Crea el archivo main.cpp.
2.1 Código básico del servidor
#include "crow_all.h"
int main() { crow::SimpleApp app;
// GET-endpoint: página raíz CROW_ROUTE(app, "/")([](){ return "Hello, REST API on C++!"; });
// GET-endpoint: /api/status CROW_ROUTE(app, "/api/status")([](){ crow::json::wvalue response; response["status"] = "ok"; response["message"] = "Server is running"; return response; });
app.port(8080).multithreaded().run();}Compila y ejecuta:
g++ main.cpp -std=c++17 -lpthread -o api_server./api_serverAhora ve en el navegador a http://localhost:8080/api/status — verás una respuesta JSON.
Paso 3: Trabajo con JSON y manejo de solicitudes POST
Una REST API real implica recibir datos del cliente. Aprendamos a aceptar JSON en el cuerpo de la solicitud.
3.1 POST-endpoint para crear un usuario
#include "crow_all.h"#include <string>#include <unordered_map>
int main() { crow::SimpleApp app; // Almacenamiento simple en memoria (para demostración) std::unordered_map<int, std::string> users; int next_id = 1;
// POST /api/users — crear un usuario CROW_ROUTE(app, "/api/users").methods("POST"_method)([&](const crow::request& req){ auto body = crow::json::load(req.body); if (!body || !body.has("name")) { return crow::response(400, "Missing 'name' field"); } std::string name = body["name"].s(); int id = next_id++; users[id] = name;
crow::json::wvalue response; response["id"] = id; response["name"] = name; return crow::response(201, response); });
// GET /api/users/{id} — obtener un usuario CROW_ROUTE(app, "/api/users/<int>")([&](int id){ auto it = users.find(id); if (it == users.end()) { return crow::response(404, "User not found"); } crow::json::wvalue response; response["id"] = id; response["name"] = it->second; return crow::response(respon