Cliente HTTP para C++: visão geral das melhores bibliotecas
Ao desenvolver aplicações modernas em C++, frequentemente surge a necessidade de interagir com servidores web através do protocolo HTTP. Seja para carregar dados de uma API, enviar formulários ou trocar mensagens JSON — um cliente HTTP confiável é indispensável. Ao contrário de muitas linguagens modernas, a biblioteca padrão do C++ não inclui meios integrados para trabalhar com HTTP. Felizmente, existem várias bibliotecas maduras e de alto desempenho que resolvem esse problema. Neste artigo, analisaremos os quatro melhores clientes HTTP para C++, compararemos suas características e daremos exemplos práticos.
1. libcurl (cURL)
libcurl é, sem dúvida, a biblioteca mais popular e testada pelo tempo para transferência de dados através de vários protocolos, incluindo HTTP/1.1 e HTTP/2. Ela é escrita em C, mas possui excelentes wrappers para C++ (por exemplo, curlpp). libcurl é usada em milhares de projetos, desde sistemas embarcados até aplicações de servidor.
Características principais:
- Suporte a HTTP, HTTPS, FTP, SMTP e muitos outros protocolos.
- Trabalho com SSL/TLS (OpenSSL, Schannel, NSS).
- Requisições assíncronas através da interface
multi. - Configuração flexível de cabeçalhos, cookies, proxies, timeouts.
- Multiplataforma (Windows, Linux, macOS, sistemas operacionais móveis).
Exemplo simples de requisição GET usando o wrapper C++ curlpp:
#include <curlpp/cURLpp.hpp>#include <curlpp/Easy.hpp>#include <sstream>
int main() { try { curlpp::Cleanup cleaner; curlpp::Easy request;
// Configuração da URL request.setOpt(new curlpp::options::Url("https://api.example.com/data"));
// Obter resposta em um fluxo de string std::ostringstream response; request.setOpt(new curlpp::options::WriteStream(&response));
// Executar requisição request.perform();
std::cout << "Resposta: " << response.str() << std::endl; } catch (curlpp::RuntimeError & e) { std::cerr << "Erro: " << e.what() << std::endl; } return 0;}2. C++ REST SDK (cpprestsdk)
C++ REST SDK (anteriormente conhecido como Casablanca) é uma biblioteca assíncrona da Microsoft, focada em trabalhar com serviços RESTful. Ela fornece uma interface conveniente baseada em pplx::task (análogo ao C++ std::future), o que simplifica a escrita de código não bloqueante.
Características principais:
- Assincronia total baseada em
taskecontinuation. - Suporte nativo a JSON (cpprest/json.h).
- Cliente WebSocket.
- Trabalho com HTTP/HTTPS, autenticação (Basic, OAuth).
- Multiplataforma (Windows, Linux, macOS).
Exemplo de requisição POST assíncrona com 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"));
// Formar corpo JSON da requisição json::value body; body[U("name")] = json::value::string(U("John")); body[U("age")] = json::value::number(30);
// Requisição 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("Erro na requisição"); }) .then([](json::value answer) { std::cout << "Resposta: " << answer.serialize() << std::endl; Também na biblioteca
Puppeteer para JavaScript (Node.js): guia completo com exemplos
Cliente OAuth para JavaScript (Node.js): visão geral e exemplos de uso
Trabalho com XML em C# (.NET): guia completo para análise e criação
Scrutor para C# (.NET): guia completo com exemplos práticos
Internacionalização (i18n) em Go (Golang): biblioteca go-i18n