cpp-httplib: HTTP без головной боли на чистом C++

01 Dec, 2025

Когда в последний раз вам нужно было быстро добавить HTTP-функциональность в C++ проект? Вспомните, сколько времени ушло на поиск подходящей библиотеки, настройку зависимостей и интеграцию. А что если я скажу, что есть решение в одном заголовочном файле, которое работает прямо из коробки?

Что в коробке?

cpp-httplib — это минималистичная библиотека для C++11 и новее, которая умеет:

  • Работать как HTTP/HTTPS сервер
  • Выступать в роли HTTP-клиента
  • Обрабатывать запросы и ответы
  • Поддерживать SSL/TLS (через OpenSSL)
  • Работать с файлами и формами

И всё это — без необходимости тянуть кучу зависимостей. Просто добавляете один заголовочный файл — и готово!

Почему это удобно?

Вот типичный сценарий из моей практики: нужно сделать простой веб-интерфейс для настройки сервиса. Варианты:

  1. Поднимать полноценный веб-сервер (Nginx/Apache) — избыточно
  2. Использовать Boost.Beast — мощно, но сложно для простых задач
  3. Написать свой велосипед — долго и ненадёжно

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", окажется идеальным решением. Особенно рекомендую:

  • Разработчикам встроенных систем
  • Создателям утилит с веб-интерфейсом
  • Тем, кто устал от сложных решений для простых задач

Попробуйте — возможно, это именно то, что вы искали последние несколько проектов!

Ссылки: