HTTP-клиент для C++: обзор лучших библиотек
При разработке современных приложений на C++ часто возникает необходимость взаимодействия с веб-серверами по протоколу HTTP. Будь то загрузка данных с API, отправка форм или обмен JSON-сообщениями — без надёжного HTTP-клиента не обойтись. В отличие от многих современных языков, стандартная библиотека C++ не включает встроенных средств для работы с HTTP. К счастью, существует несколько зрелых и производительных библиотек, которые решают эту задачу. В этой статье мы рассмотрим четыре лучших HTTP-клиента для C++, сравним их особенности и приведём практические примеры.
1. libcurl (cURL)
libcurl — это, пожалуй, самая популярная и проверенная временем библиотека для передачи данных по различным протоколам, включая HTTP/1.1 и HTTP/2. Она написана на C, но имеет отличные обёртки для C++ (например, curlpp). libcurl используется в тысячах проектов, от встраиваемых систем до серверных приложений.
Ключевые особенности:
- Поддержка HTTP, HTTPS, FTP, SMTP и множества других протоколов.
- Работа с SSL/TLS (OpenSSL, Schannel, NSS).
- Асинхронные запросы через
multiинтерфейс. - Гибкая настройка заголовков, cookies, прокси, таймаутов.
- Кроссплатформенность (Windows, Linux, macOS, мобильные ОС).
Простой пример GET-запроса с использованием C++ обёртки curlpp:
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <sstream>
int main() {
try {
curlpp::Cleanup cleaner;
curlpp::Easy request;
// Настройка URL
request.setOpt(new curlpp::options::Url("https://api.example.com/data"));
// Получение ответа в строковый поток
std::ostringstream response;
request.setOpt(new curlpp::options::WriteStream(&response));
// Выполнение запроса
request.perform();
std::cout << "Ответ: " << response.str() << std::endl;
}
catch (curlpp::RuntimeError & e) {
std::cerr << "Ошибка: " << e.what() << std::endl;
}
return 0;
}
2. C++ REST SDK (cpprestsdk)
C++ REST SDK (ранее известный как Casablanca) — это асинхронная библиотека от Microsoft, ориентированная на работу с RESTful сервисами. Она предоставляет удобный интерфейс на основе pplx::task (аналог C++ std::future), что упрощает написание неблокирующего кода.
Ключевые особенности:
- Полная асинхронность на основе
taskиcontinuation. - Встроенная поддержка JSON (cpprest/json.h).
- WebSocket клиент.
- Работа с HTTP/HTTPS, авторизация (Basic, OAuth).
- Кроссплатформенность (Windows, Linux, macOS).
Пример асинхронного POST-запроса с 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"));
// Формируем JSON тело запроса
json::value body;
body[U("name")] = json::value::string(U("John"));
body[U("age")] = json::value::number(30);
// 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("Ошибка запроса");
})
.then([](json::value answer) {
std::cout << "Ответ: " << answer.serialize() << std::endl;
})
.wait(); // Блокируем основной поток для демонстрации
return 0;
}
3. Boost.Beast
Boost.Beast — это библиотека на основе Boost.Asio, предоставляющая низкоуровневый контроль над HTTP и WebSocket протоколами. Она идеально подходит для разработки высокопроизводительных серверов и клиентов, где важна каждая микросекунда. Beast — это не просто клиент, а полноценный инструментарий для работы с HTTP-сообщениями.
Ключевые особенности:
- Работа поверх Boost.Asio (син