cpp-httplib:一个头文件跑通 C++ HTTP 服务器与客户端
2026/9/10 13:15:07 网站建设 项目流程

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 # 输出 pong

listen()是阻塞调用,按 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_timeoutset_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询