Cliente HTTP en C++: haciendo solicitudes correctamente

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: ¿por qué escribir un cliente HTTP en C++?



En el desarrollo moderno, la interacción con servidores remotos es una de las tareas clave. Ya sea obtener datos de una API REST, enviar un formulario al servidor o descargar un archivo, en todas partes se utiliza el protocolo HTTP. A pesar de que Python y JavaScript ofrecen soluciones integradas simples, C++ sigue siendo demandado para escribir clientes HTTP de alto rendimiento. Esto es necesario para sistemas embebidos, motores de juegos, backends de alta carga o simplemente para estudiar los mecanismos de red de bajo nivel.



En este artículo, analizaremos dos enfoques populares para implementar un cliente HTTP en C++: el uso de la biblioteca libcurl (cURL) y un enfoque asíncrono más moderno con Boost.Beast. Aprenderá cómo formar correctamente solicitudes GET y POST, procesar respuestas y evitar errores típicos.



1. Enfoque clásico: Cliente HTTP en C++ con libcurl



La biblioteca libcurl es una herramienta probada por el tiempo para la transferencia de datos a través de varios protocolos. Soporta HTTP/1.1, HTTP/2, HTTPS, autenticación, cookies y mucho más. Para C++ existe un envoltorio conveniente curl/curl.h que permite integrar fácilmente cURL en su proyecto.



Instalación de libcurl

En la mayoría de las distribuciones de Linux, cURL ya está instalado. Para el desarrollo, se necesitará el paquete de desarrollo:

sudo apt-get install libcurl4-openssl-dev  # Ubuntu/Debianbrew install curl                          # macOS


Ejemplo: Solicitud GET

Escribamos un cliente HTTP simple en C++ que obtenga datos de una API pública (por ejemplo, JSONPlaceholder).

#include <iostream>#include <string>#include <curl/curl.h>

// Callback para escribir datos en std::stringstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}

int main() { CURL *curl; CURLcode res; std::string readBuffer;

curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();

if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // Ejecutamos la solicitud res = curl_easy_perform(curl); if(res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "Respuesta del servidor:" << readBuffer << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0;}


Ejemplo: Solicitud POST con JSON

Ahora enviaremos datos al servidor. Para ello, es necesario especificar el tipo de contenido y el cuerpo de la solicitud.

#include <iostream>#include <string>#include <curl/curl.h>

int main() { CURL *curl; CURLcode res; std::string response; // Datos JSON para enviar std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})"; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); // Establecemos los encabezados struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // Callback para escribir la respuesta curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](void *contents, size_t size, size_t nmemb, void *userp) -> siz

Blogs

Book Recommendations