Trabajo con API en C++: REST, GraphQL, gRPC
Cuando se trata de crear o consumir API, muchos desarrolladores por costumbre recurren a Python, Node.js o Go. Pero, ¿qué sucede si necesita el máximo rendimiento, control de bajo nivel sobre la memoria o trabaja en un sistema heredado donde C++ es el rey? La respuesta es simple: C++ no solo vive, sino que prospera en el mundo de las API. Analicemos tres enfoques clave que todo desarrollador de C++ debería conocer: el clásico REST, el moderno GraphQL y el de alto rendimiento gRPC.
Este artículo no es una guía de referencia árida, sino una guía práctica escrita para quienes desean escribir código real. Veremos cómo se aplican estas tecnologías en C++, proporcionaremos ejemplos con bibliotecas populares y ayudaremos a elegir la herramienta adecuada para su tarea.
1. API REST en C++: clásico en una interpretación moderna
REST (Transferencia de Estado Representacional) sigue siendo el estilo de API más común. Es apreciado por su simplicidad, legibilidad humana del JSON y versatilidad. En C++, tenemos varias herramientas potentes para trabajar con REST, y una de las más populares es cpprestsdk (también conocido como Casablanca) de Microsoft.
Escribiendo un cliente REST en C++
Imaginemos que necesitamos obtener datos meteorológicos de una API pública. Así es como se ve con cpprestsdk:
#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <iostream>
using namespace web;using namespace web::http;using namespace web::http::client;
int main() { // Creamos un cliente HTTP http_client client(U("https://api.openweathermap.org/data/2.5"));
// Formamos una solicitud GET con parámetros uri_builder builder(U("/weather")); builder.append_query(U("q"), U("Moscow")); builder.append_query(U("appid"), U("YOUR_API_KEY")); builder.append_query(U("units"), U("metric"));
// Enviamos la solicitud y obtenemos la respuesta client.request(methods::GET, builder.to_string()) .then([](http_response response) { if (response.status_code() == status_codes::OK) { return response.extract_json(); } throw std::runtime_error("Error al obtener datos"); }) .then([](json::value jsonData) { std::cout << "Temperatura: " << jsonData[U("main")][U("temp")].as_double() << "°C" << std::endl; }) .wait();
return 0;}Puntos clave:
- Asincronía: cpprestsdk utiliza PPL (Parallel Patterns Library) y futures, ideal para C++.
- Trabajo con JSON: el analizador incorporado json::value permite manipular datos fácilmente.
- Multiplataforma: la biblioteca funciona en Windows, Linux y macOS.
¿Cuándo elegir REST?
REST en C++ es ideal para:
- Operaciones CRUD simples
- Integración con servicios web (redes sociales, sistemas de pago)
- Prototipado y microservicios con carga baja
2. GraphQL: flexibilidad de consultas en C++
GraphQL resuelve el principal problema de REST: el overfetching (obtener datos innecesarios) y el underfetching (necesidad de múltiples solicitudes para obtener información completa). En C++, para trabajar con GraphQL se usa más frecuentemente la biblioteca cppgraphql o se escribe un cliente propio basado en libcurl.
Ejemplo de consulta GraphQL en C++
Supongamos que necesitamos obtener el perfil de un usuario y sus últimas publicaciones; en REST esto requeriría dos solicitudes, mientras que en GraphQL solo una:
#include <iostream>#include <curl/curl.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->a