cpp-httplib:一个头文件跑通 C++ HTTP 服务器与客户端
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
给 C++ 项目加 HTTP 接口,常见的体验是:拉一堆依赖、配置构建系统,再花半天时间调通第一个 GET 请求。cpp-httplib 把这件事压缩成"拷一个头文件进来,然后编译"。
📌 项目坐标
cpp-httplib 是一个 C++11 单文件、header-only 的库,同时覆盖服务器和客户端。全部核心逻辑装在一个httplib.h里,基础 HTTP 功能零第三方依赖;要 HTTPS 时按编译期宏选择 OpenSSL、Mbed TLS 或 wolfSSL 之一即可。交付形态极其直接:把文件拷进工程就能用,不需要 CMake 或包管理器,Linux、macOS、Windows 均可编译。
- 语言要求:C++11(官方示例用 C++17 写法更简洁)
- 平台:64 位 Linux / macOS / Windows,官方明确不支持 32 位
- 协议基线:仅 HTTP/1.1,阻塞式 socket I/O
🔨 跑通最小演示
克隆仓库后,httplib.h就在根目录:
git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib写一个server.cpp,注册两个路由,#include指向那份头文件:
#include "httplib.h" // 指向克隆得到的 httplib.h int main() { httplib::Server svr; svr.Get("/ping", [](const httplib::Request&, httplib::Response& res) { res.set_content("pong", "text/plain"); }); svr.Get("/health", [](const httplib::Request&, httplib::Response& res) { res.set_content(R"({"status":"ok"})", "application/json"); }); return svr.listen("127.0.0.1", 8080) ? 0 : 1; }编译后运行,另开终端验证:
g++ -std=c++11 -pthread -o server server.cpp ./server & curl http://127.0.0.1:8080/ping # 输出 ponglisten()是阻塞调用,按 Ctrl+C 停止服务。十几行代码,一个可用的 HTTP 服务就起来了。
🗺️ 能力版图
按能力域来看,能快速判断它擅长什么、不擅长什么。
协议能力。标准方法(Get/Post/Put/Patch/Delete/Options)全部支持,非标准方法也能通过CustomRoute注册,WebDAV 的PROPFIND这类扩展方法不在话下。在此之上还有两条实时通道:WebSocket 与 Server-Sent Events:
svr.WebSocket("/ws", [](const auto&, httplib::ws::WebSocket& ws) { std::string msg; while (ws.read(msg)) { ws.send("Echo: " + msg); } });服务端能力。路由支持路径参数(/users/:id)和正则两种写法;set_mount_point()把一个目录映射到 URL 前缀,直接承担静态文件服务;multipart 上传用req.form逐字段读取;大响应可以set_content_provider或 chunked provider 分块发出,不必整块驻留内存。默认线程池为 8 个线程(或hardware_concurrency - 1),负载上来后动态扩容。
客户端能力。Client覆盖日常全部方法,keep-alive、自动跟随重定向、代理与NO_PROXY规则、连接/读/写超时、进度回调、Range 断点下载一应俱全。
TLS 与扩展。三个 TLS 后端用编译期宏切换,支持双向认证(mTLS);响应压缩可选 zlib、Brotli、zstd;还支持 Unix domain socket 通信。
🛠️ 两种典型落地姿势
姿势一:静态页面 + API 端点同进程。小工具、内部面板的典型做法:set_mount_point指向前端目录,再挂几个Get/Post处理 API。路由 handler 优先于静态文件,没被路由接住的路径自动落到文件查找,两者可以共存。两个注意点:静态文件服务相关方法非线程安全,运行中不要增删挂载点;POSIX 下指向挂载目录外的符号链接会被拒绝,但文件访问权限仍由你自己管理。
官方 tour 章节就按这条路线搭了一个完整的翻译应用:先写 REST API,再挂 Web 前端,最后套上桌面壳。Web 前端长这样:
姿势二:工具内调用上游服务。命令行工具或服务对服务调用时,主要成本在错误处理。客户端返回值有两层:连接失败(res为空,用res.error()区分是超时、DNS 还是 SSL 问题),以及 HTTP 状态失败(服务端返回 4xx/5xx,看res->status)。上线前记得设set_max_timeout和set_payload_max_length(默认 100MB 上限),避免请求挂死或响应撑爆内存。
⚖️ 边界与取舍
README 开头就把限制摆得很直白,选型前值得读一遍:
- 阻塞 I/O、每连接占线程:中小并发没问题,追求非阻塞高并发模型的话,cpp-httplib 不是对的选择
- 只到 HTTP/1.1:没有 HTTP/2、HTTP/3,需要 gRPC 之类协议的团队另找方案
- WebSocket 每连接占一个线程(外加心跳线程),大量并发长连接超出设计目标
- 32 位平台不受支持,其安全问题不跟进;g++ 4.8 及以下因
<regex>缺陷无法编译
边界很清楚:中小并发、HTTP/1.1、64 位环境,三条都满足就可以放心用。
📚 继续深入
- README.md:主文档,TLS、路由、压缩、线程池的完整示例都在里面
- docs-src/pages/en/tour/:九章 tour,从跑通到 WebSocket 逐章推进
- example/:可运行示例,hello、client、server、SSE、WebSocket 回显都有
- README-sse.md、README-stream.md、README-websocket.md:SSE、流式 API、WebSocket 三个专项
- test/:gtest 测试套件与 fuzzing 语料,验证行为细节时很实用
内部工具、原型验证、中小并发服务,cpp-httplib 值得直接进工程;主诉求是极限并发或 HTTP/2 时,优先看非阻塞方案。
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考