Cliente HTTP para C++: revisión de las mejores bibliotecas
Al desarrollar aplicaciones modernas en C++, a menudo surge la necesidad de interactuar con servidores web mediante el protocolo HTTP. Ya sea para descargar datos de una API, enviar formularios o intercambiar mensajes JSON, no se puede prescindir de un cliente HTTP fiable. A diferencia de muchos lenguajes modernos, la biblioteca estándar de C++ no incluye herramientas integradas para trabajar con HTTP. Afortunadamente, existen varias bibliotecas maduras y de alto rendimiento que resuelven esta tarea. En este artículo, revisaremos los cuatro mejores clientes HTTP para C++, compararemos sus características y proporcionaremos ejemplos prácticos.
1. libcurl (cURL)
libcurl es, probablemente, la biblioteca más popular y probada por el tiempo para la transferencia de datos a través de varios protocolos, incluyendo HTTP/1.1 y HTTP/2. Está escrita en C, pero tiene excelentes envoltorios para C++ (por ejemplo, curlpp). libcurl se utiliza en miles de proyectos, desde sistemas embebidos hasta aplicaciones de servidor.
Características clave:
- Soporte para HTTP, HTTPS, FTP, SMTP y muchos otros protocolos.
- Trabajo con SSL/TLS (OpenSSL, Schannel, NSS).
- Solicitudes asíncronas a través de la interfaz
multi. - Configuración flexible de cabeceras, cookies, proxy, tiempos de espera.
- Multiplataforma (Windows, Linux, macOS, sistemas operativos móviles).
Ejemplo simple de solicitud GET usando el envoltorio C++ curlpp:
#include <curlpp/cURLpp.hpp>#include <curlpp/Easy.hpp>#include <sstream>
int main() { try { curlpp::Cleanup cleaner; curlpp::Easy request;
// Configuración de la URL request.setOpt(new curlpp::options::Url("https://api.example.com/data"));
// Obtención de la respuesta en un flujo de cadena std::ostringstream response; request.setOpt(new curlpp::options::WriteStream(&response));
// Ejecución de la solicitud request.perform();
std::cout << "Respuesta: " << response.str() << std::endl; } catch (curlpp::RuntimeError & e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}2. C++ REST SDK (cpprestsdk)
C++ REST SDK (anteriormente conocido como Casablanca) es una biblioteca asíncrona de Microsoft, orientada a trabajar con servicios RESTful. Proporciona una interfaz conveniente basada en pplx::task (análogo a C++ std::future), lo que facilita la escritura de código no bloqueante.
Características clave:
- Asincronía completa basada en
taskycontinuation. - Soporte integrado para JSON (cpprest/json.h).
- Cliente WebSocket.
- Trabajo con HTTP/HTTPS, autorización (Basic, OAuth).
- Multiplataforma (Windows, Linux, macOS).
Ejemplo de solicitud POST asíncrona con JSON:
#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <cpprest/json.h>
using namespace web;using namespace web::http;using namespace web::http::client;
int main() { http_client client(U("https://api.example.com"));
// Formamos el cuerpo JSON de la solicitud json::value body; body[U("name")] = json::value::string(U("John")); body[U("age")] = json::value::number(30);
// Solicitud POST client.request(methods::POST, U("/users"), body.serialize(), U("application/json")) .then([](http_response response) { if (response.status_code() == status_codes::Created) { return response.extract_json(); } throw std::runtime_error("Error de solicitud"); }) .then([](json::value answer) { std::cout << "Respuesta: " << answer.serialize() << std::endl;