cpp-httplib:1 个头文件里的完整 C++ HTTP/HTTPS 库
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
想给 C++ 程序加个 Web 界面,却不想引入一整个框架和构建系统?cpp-httplib 是一个单文件的 C++11 HTTP/HTTPS 库,1 个头文件里同时给了你服务器和客户端。
🧩 一句话定位:从头文件到第一次响应只要 3 分钟
它把"能对外提供 HTTP/HTTPS 服务"和"能主动发 HTTP/HTTPS 请求"两件事塞进一个头文件,无需链接库,也没有配置文件要写。
手头没有仓库的话,执行git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib,或者只把其中的httplib.h拷进项目目录即可。
#include "httplib.h" int main() { httplib::Server svr; svr.Get("/", [](const httplib::Request &, httplib::Response &res) { res.set_content("Hello, World!", "text/plain"); }); svr.listen("0.0.0.0", 8080); }存成 server.cpp,用g++ -std=c++17 -pthread -o server server.cpp编译运行,浏览器访问 http://localhost:8080 就能看到 Hello, World!。
🗺️ 能力地图:它能做什么
开启 HTTPS 只需 1 个宏,WebSocket 和 SSE 开箱即用
- HTTP/1.1 服务器与客户端一体,路由就是注册一个 lambda
#include前加一个#define就能启用 TLS,OpenSSL、Mbed TLS、wolfSSL 三种后端可选- WebSocket 双向通信、SSE 单向推送都有实现,客户端侧的 SSE 还自带自动重连
- 分块上传下载、multipart 表单解析、静态目录托管,都是现成 API
#define CPPHTTPLIB_OPENSSL_SUPPORT // 或 Mbed TLS / wolfSSL 对应宏 #include "httplib.h" httplib::SSLServer svr("./cert.pem", "./key.pem");单文件放进去,线程池与优雅退出直接可用
- C++11 起步即可编译,GCC、Clang、MSVC 全支持,Windows / Linux / macOS 均可
- 内置 ThreadPool 处理并发请求,用
new_task_queue调整线程数 stop()会等在手请求处理完再退出,适合做信号驱动的优雅关闭set_pre_routing_handler提供统一钩子,做鉴权、日志这类前置处理
svr.new_task_queue = [] { return new httplib::ThreadPool(8, 128); }; svr.set_mount_point("/", "./web"); // 静态文件目录 // 退出前调用 svr.stop() 优雅关闭更多写法和踩坑记录可以看 示例代码集合。
🛠️ 真实项目走查:本地翻译工具与自托管管理面板
场景一:把本地 LLM 包成团队能用的翻译工具。背景是把 llama.cpp 模型包成一个翻译服务,前端不用 Node,浏览器直接访问。仓库文档里有一篇教程分 6 章走完"REST API → SSE 流式输出 → Web UI → 桌面应用",见 LLM 应用教程。核心代码只有接口这一层:
svr.Post("/translate", [](const httplib::Request &req, httplib::Response &res) { auto input = json::parse(req.body, nullptr, false); if (input.is_discarded()) { res.status = 400; return; } auto text = input["text"].get<std::string>(); res.set_content(json{{"translation", llm.chat(text)}}.dump(), "application/json"); });这样前后端共用同一个 C++ 进程,最终打包出来就是一个可执行文件,分发时不用带任何运行时。
场景二:自托管文件服务器的管理面板。背景是一台架在公司局域网里的小文件服务器,需要一个既能浏览文件、又能查服务状态的 Web 面板,且不想额外引入前端构建链:
httplib::Server svr; svr.set_mount_point("/", "./www"); // 静态文件浏览 svr.Get("/api/health", [](const httplib::Request &, httplib::Response &res) { res.set_content(R"({"status":"ok"})", "application/json"); }); svr.listen("127.0.0.1", 9090);好处是管理面板和文件服务合在一个进程里,资源受限的嵌入式设备、NAS 上跑起来也很轻,用 cpp-httplib 搭建嵌入式 Web 界面基本就是这种形态。
⚖️ 选型参考与避坑指南:适合谁,坑在哪
适合你,如果你:
- 想给 C++ 工具或 CLI 加一个管理界面 / 本地 API
- 在设备或自托管服务里内嵌 Web 界面,产物希望尽量小
- 需要 C++ 程序主动发 HTTP 请求,作为调用外部服务的客户端
- 在找 cpp-httplib 单文件 头文件 使用方式,或想替代 Boost.Beast 多文件、难上手的集成成本
不适合你,如果你:
- 要写高并发流量入口网关——它是阻塞式 I/O,一条连接占一个线程
- 业务必须走 HTTP/2 或 HTTP/3——这里只有 HTTP/1.1
- 目标是 32 位平台——README 明确声明不支持,不建议冒险
三个真实存在的坑:
- 长连接业务会占住工作线程:SSE、WebSocket 每个连接都挂着一个线程,并发高时必须用
new_task_queue配ThreadPool(小值, 大值)做弹性扩缩。 - 单个头文件约 2.2 万行、770KB 左右:多个编译单元都包含它时编译时间会明显变长,建议把服务器逻辑隔离到一个编译单元,或启用预编译头。
- TLS 后端行为不一致:OpenSSL 要求 3.0 以上;Mbed TLS / wolfSSL 下 CA 证书枚举只反映
load_ca_cert_store()加载的部分;BoringSSL 仅为尽力支持,可能随上游 API 变动。
这个库基于阻塞 socket I/O、仅支持 HTTP/1.1,README 把这条边界放在了最前面——接受这一点的话,它基本是 C++ 代码通往可用 Web 界面最短的路径之一。
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考