cpp-httplib: HTTP без головной боли на чистом C++
Когда в последний раз вам нужно было быстро добавить HTTP-функциональность в C++ проект? Вспомните, сколько времени ушло на поиск подходящей библиотеки, настройку зависимостей и интеграцию. А что если я скажу, что есть решение в одном заголовочном файле, которое работает прямо из коробки?
Что в коробке?
cpp-httplib — это минималистичная библиотека для C++11 и новее, которая умеет:
- Работать как HTTP/HTTPS сервер
- Выступать в роли HTTP-клиента
- Обрабатывать запросы и ответы
- Поддерживать SSL/TLS (через OpenSSL)
- Работать с файлами и формами
И всё это — без необходимости тянуть кучу зависимостей. Просто добавляете один заголовочный файл — и готово!
Почему это удобно?
Вот типичный сценарий из моей практики: нужно сделать простой веб-интерфейс для настройки сервиса. Варианты:
- Поднимать полноценный веб-сервер (Nginx/Apache) — избыточно
- Использовать Boost.Beast — мощно, но сложно для простых задач
- Написать свой велосипед — долго и ненадёжно
cpp-httplib идеально ложится в эту нишу — даёт необходимый функционал без лишнего оверхеда.
5 главных фишек, которые вас зацепят
1. Сервер в 5 строк кода
#include "httplib.h"
int main() {
httplib::Server svr;
svr.Get("/hi", [](auto&, auto& res) { res.set_content("Hello World!", "text/plain"); });
svr.listen("0.0.0.0", 8080);
}
Запустили — и у вас работает веб-сервер на порту 8080, отвечающий "Hello World!" на запросы к /hi.
2. Полноценный клиент с SSL
httplib::Client cli("https://api.example.com");
auto res = cli.Get("/data");
if (res && res->status == 200) {
std::cout << res->body << std::endl;
}
Поддержка HTTPS из коробки (требуется OpenSSL), обработка ошибок, удобный интерфейс.
3. Работа с формами и файлами
Загрузка файлов на сервер:
svr.Post("/upload", [](const auto& req, auto& res) {
if (req.has_file("avatar")) {
auto file = req.get_file("avatar");
std::ofstream ofs(file.filename, std::ios::binary);
ofs << file.content;
}
});
4. Статический файловый сервер
svr.set_mount_point("/", "./www");
Одна строка — и все файлы из папки ./www доступны по HTTP.
5. Поддержка Server-Sent Events
Реализация push-уведомлений от сервера к клиенту:
svr.Get("/events", [](auto& req, auto& res) {
res.set_chunked_content_provider("text/event-stream", [](auto, auto& sink) {
sink.write("data: update\n\n");
return true;
});
});
Когда стоит использовать?
- Прототипирование веб-сервисов
- Встроенные веб-интерфейсы для приложений
- Микросервисы с минимальными требованиями
- Тестовые серверы для разработки
- Клиенты для HTTP API
Что под капотом?
- Один заголовочный файл — простота интеграции
- Блокирующий I/O — простота кода (для неблокирующих операций смотрите другие библиотеки)
- Потокобезопасность — встроенный пул потоков
- Кросс-платформенность — работает на Windows, Linux, macOS
- Минимальные зависимости — только OpenSSL для HTTPS
Ограничения
- Нет поддержки WebSocket
- Блокирующая модель может не подойти для высоконагруженных сервисов
- Для сложных сценариев лучше рассмотреть Boost.Beast или специализированные фреймворки
cpp-httplib — это как швейцарский нож в мире HTTP для C++. Не заменит полноценный фреймворк, но в 90% случаев, когда нужно "просто HTTP", окажется идеальным решением. Особенно рекомендую:
- Разработчикам встроенных систем
- Создателям утилит с веб-интерфейсом
- Тем, кто устал от сложных решений для простых задач
Попробуйте — возможно, это именно то, что вы искали последние несколько проектов!
Ссылки: