Cliente HTTP para C++: visão geral das melhores bibliotecas
O desenvolvimento de aplicações de rede em C++ tradicionalmente era considerado uma tarefa complexa devido à falta de suporte nativo a HTTP e à necessidade de trabalhar com sockets de baixo nível. No entanto, as bibliotecas modernas resolvem completamente esse problema, fornecendo ferramentas convenientes, seguras e eficientes para enviar requisições HTTP, processar respostas e trabalhar com REST API. Neste artigo, vamos analisar as quatro soluções mais populares e maduras que ajudarão você a implementar rapidamente um cliente HTTP no seu projeto em C++.
1. libcurl — o padrão universal
libcurl é a biblioteca mais conhecida e amplamente utilizada para transferência de dados por vários protocolos, incluindo HTTP/HTTPS, FTP, SMTP e muitos outros. Ela é escrita em C, mas possui um wrapper oficial para C++ (curl/curl.h). Principais vantagens: suporte a praticamente todas as versões do HTTP (até HTTP/3), trabalho com proxies, autenticação, SSL/TLS, multithreading e uma enorme comunidade.
Exemplo de uma requisição GET simples usando libcurl:
#include <curl/curl.h>#include <string>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* buffer) { size_t totalSize = size * nmemb; buffer->append(static_cast<char*>(contents), totalSize); return totalSize;}
int main() { CURL* curl = curl_easy_init(); if (curl) { std::string response; curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/data"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl); if (res == CURLE_OK) { // Trabalha com a response } curl_easy_cleanup(curl); } return 0;}Desvantagens: API no estilo C (requer gerenciamento manual de memória), necessidade de compilação com flags de linkagem (-lcurl).
2. cpp-httplib — biblioteca leve e header-only
cpp-httplib (autor yhirose) é uma biblioteca moderna, de único cabeçalho (header-only) para C++11 e superior. Ela não requer dependências externas (exceto OpenSSL para HTTPS) e é ideal para projetos pequenos, microsserviços e prototipagem. Suporta requisições síncronas e assíncronas, cookies, timeouts, multipart/form-data.
Exemplo de uma requisição POST com JSON:
#include <httplib.h>
int main() { httplib::Client cli("https://api.example.com"); httplib::Headers headers = { {"Content-Type", "application/json"} }; auto res = cli.Post("/submit", headers, R"({"key":"value"})", "application/json"); if (res && res->status == 200) { std::cout << res->body << std::endl; } return 0;}Pontos positivos: barreira de entrada mínima, sem necessidade de linkagem, código C++ puro. Pontos negativos: suporte limitado a funcionalidades avançadas (por exemplo, HTTP/2).
3. Boost.Beast — ferramenta poderosa para profissionais
Boost.Beast é uma biblioteca da equipe Boost, construída sobre o Boost.Asio. Ela fornece controle de baixo nível sobre conexões HTTP/1.x e WebSocket. É recomendada para sistemas de alta carga, onde desempenho e processamento assíncrono são importantes.
Exemplo de um cliente HTTP assíncrono (fragmento):
#include <boost/beast/core.hpp>#include <boost/beast/http.hpp>#include <boost/beast/version.hpp>#include <boost/asio/connect.hpp>#include <boost/asio/ip/tcp.hpp>
namespace beast = boost::beast;namespace http = beast::http;namespace net = boost::asio;using tcp = net::ip::tcp;
int main() { net::io_context ioc; tcp::resolver resolver(ioc); beast::tcp_stream stream(ioc);
auto const results = resolver.resolv