Introducción: ¿por qué escribir una REST API en C++?
REST API (Representational State Transfer) es un estilo arquitectónico para la interacción de componentes de una aplicación distribuida en la red. Normalmente, para escribir una REST API se elige Python (Flask, FastAPI), JavaScript (Express.js) o Java. Sin embargo, C++ sigue siendo injustamente ignorado. Y es una lástima.
Las bibliotecas modernas, como Crow, cpp-httplib y Drogon, permiten crear REST API de alto rendimiento en C++ literalmente en media hora. Gracias a la velocidad de C++ y al consumo mínimo de memoria, estas API son ideales para:
- microservicios con altos requisitos de rendimiento;
- sistemas embebidos y dispositivos IoT;
- procesamiento de un gran número de solicitudes concurrentes;
- implementación de gateways y servidores proxy.
En este artículo, crearemos en la práctica una REST API simple en C++ utilizando la biblioteca Crow. Verá que no es más difícil que en Python, y en cuanto a velocidad de ejecución, es varias veces más rápido.
Configuración del entorno e instalación de la biblioteca Crow
Para nuestro proyecto, utilizaremos Crow, un micro-framework web en C++ minimalista y muy rápido. Admite enrutamiento, middleware, serialización JSON y funciona en Windows, Linux y macOS.
Qué se necesita
- Compilador C++17 o superior (GCC 8+, Clang 7+, MSVC 2019+);
- CMake versión 3.14+;
- Biblioteca
asio(se instala automáticamente con Crow); - Biblioteca
nlohmann/json(para trabajar con JSON).
Instalación de Crow
Crow es una biblioteca header-only. Esto significa que no necesita compilarla, solo copiar los archivos de cabecera en el proyecto. La forma más sencilla es a través de CMake FetchContent.
Cree la estructura del proyecto:
rest-api-cpp/├── CMakeLists.txt├── src/│ └── main.cpp└── include/Contenido del archivo CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)project(rest_api_cpp)
set(CMAKE_CXX_STANDARD 17)
# Incluimos Crowinclude(FetchContent)FetchContent_Declare( crow GIT_REPOSITORY https://github.com/ipkn/crow.git GIT_TAG master)FetchContent_MakeAvailable(crow)
# Incluimos nlohmann/jsonFetchContent_Declare( json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.2)FetchContent_MakeAvailable(json)
add_executable(rest_api src/main.cpp)target_link_libraries(rest_api PRIVATE Crow::Crow nlohmann_json::nlohmann_json)Después de esto, ejecute:
mkdir build && cd buildcmake ..makeTodo está listo para escribir el código.
Creación de una REST API básica en C++ con Crow
Escribamos una API simple para gestionar una lista de tareas (Task Manager). Será compatible con cuatro métodos HTTP principales: GET, POST, PUT, DELETE.
Esqueleto del servidor y endpoint GET
#include <crow.h>#include <nlohmann/json.hpp>#include <vector>#include <string>
using json = nlohmann::json;
struct Task { int id; std::string title; bool completed;};
std::vector<Task> tasks = { {1, "Estudiar Crow", false}, {2, "Escribir REST API", false}};int next_id = 3;
int main() { crow::SimpleApp app;
// GET /tasks — obtener todas las tareas CROW_ROUTE(app, "/tasks") .methods("GET"_method) ([](){ json j = json::array(); for (const auto& t : tasks) { j.push_back({{"id", t.id}, {"title", t.title}, {"completed", t.completed}}); } return crow::response(j.dump()); });
app.port(8080).multithreaded().run();}Este código inicia un servidor HTTP en el puerto 8080. Cuando se realiza una solicitud GET a /tasks