HTTP-клиент для C++: топ библиотек для работы с сетью

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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);                    

Рекомендаций