HTTP-клиент для C++: обзор лучших библиотек
Разработка сетевых приложений на C++ традиционно считалась сложной задачей из-за отсутствия встроенной поддержки HTTP и необходимости работы с низкоуровневыми сокетами. Однако современные библиотеки полностью решают эту проблему, предоставляя удобные, безопасные и производительные инструменты для отправки HTTP-запросов, обработки ответов и работы с REST API. В этой статье мы рассмотрим четыре наиболее популярных и зрелых решения, которые помогут вам быстро внедрить HTTP-клиент в ваш проект на C++.
1. libcurl — универсальный стандарт
libcurl — это самая известная и широко используемая библиотека для передачи данных по различным протоколам, включая HTTP/HTTPS, FTP, SMTP и многие другие. Она написана на C, но имеет официальную обёртку для C++ (curl/curl.h). Основные преимущества: поддержка практически всех версий HTTP (вплоть до HTTP/3), работа с прокси, аутентификация, SSL/TLS, многопоточность и огромное комьюнити.
Пример простого GET-запроса с использованием 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) {
// Работаем с response
}
curl_easy_cleanup(curl);
}
return 0;
}
Недостатки: C-style API (требуется ручное управление памятью), необходимость компиляции с флагами линковки (-lcurl).
2. cpp-httplib — лёгкая и header-only библиотека
cpp-httplib (автор yhirose) — это современная, одноголовочная (header-only) библиотека для C++11 и выше. Она не требует внешних зависимостей (кроме OpenSSL для HTTPS) и идеально подходит для небольших проектов, микросервисов и прототипирования. Поддерживает синхронные и асинхронные запросы, cookie, таймауты, multipart/form-data.
Пример POST-запроса с 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;
}
Плюсы: минимальный порог входа, отсутствие линковки, чистый C++ код. Минусы: ограниченная поддержка продвинутых функций (например, HTTP/2).
3. Boost.Beast — мощный инструмент для профессионалов
Boost.Beast — это библиотека от команды Boost, построенная поверх Boost.Asio. Она предоставляет низкоуровневый контроль над HTTP/1.x и WebSocket соединениями. Рекомендуется для высоконагруженных систем, где важна производительность и асинхронная обработка.
Пример асинхронного HTTP-клиента (фрагмент):
#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.resolve("example.com", "80");
stream.connect(results);
http::request<http::string_body> req{http::verb::get, "/", 11};
req.set(http::field::host, "example.com");
http::write(stream, req);
beast::flat_buffer buffer;
http::response<http::dynamic_body> res;
http::read(stream, buffer, res);
std::cout << beast::buffers_to_string(res.body().data()) << std::endl;
beast::error_code ec;
stream.socket().shutdown(tcp::socket::shutdown_both, ec);