
cpp-httplib1 个头文件写出的 C HTTP/HTTPS 库够不够用【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib在 C 里做点 HTTP/HTTPS 通信你大概只有三条路自己撸 socket 和协议解析、引入一个庞大的框架链接一堆依赖、学一套复杂的心智模型或者找一个介于两者之间的轻量库。cpp-httplib 就是第三种选择——一个 C11 单文件、header-only 的 HTTP/HTTPS 服务器兼客户端库。整库只有httplib.h一个文件复制进项目、#include一下就能用不需要配置任何构建系统。这篇文章不打算走安装→功能列表→总结的套路而是按你实际会遇到的问题顺序来它为什么值得考虑、最快怎么跑起来、能力边界画在哪里、哪些坑要提前知道。 为什么是 cpp-httplib先说清楚它的定位免得期望错位单文件、零依赖没有第三方库依赖TLS 除外见后文不用管 CMake 找库、不用管头文件路径。对想在现有工程里加两个 API 端点这种需求来说摩擦几乎为零。服务器和客户端同库httplib::Server起服务端httplib::Client发请求一套头文件两种角色微服务之间互相调用也用得上。跨平台Windows、Linux、macOS 均支持GCC、Clang、MSVC 都能编译。TLS 后端可换OpenSSLCPPHTTPLIB_OPENSSL_SUPPORT、Mbed TLSCPPHTTPLIB_MBEDTLS_SUPPORT、wolfSSLCPPHTTPLIB_WOLFSSL_SUPPORT三选一编译期宏切换嵌入式环境里挑轻量后端很顺手。但它也有明确的不做README 开头就写了两条硬边界阻塞式 socket I/O、只支持 HTTP/1.1HTTP/2 和 HTTP/3 没有实现。如果你的场景是一个进程要扛几千个并发连接异步 I/O 框架如 Beast、async_simple 自研协议层更合适如果它满足的是设备管理页面、内部 API 网关、服务间调用那它的简单性就是优势而不是妥协。另外注意 32 位平台官方明确不支持别往那上面放。 最快路径10 分钟跑通一个服务拿到httplib.h仓库根目录或git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib后取文件写 15 行代码#include httplib.h int main() { httplib::Server svr; svr.Get(/ping, [](const httplib::Request, httplib::Response res) { res.set_content(pong, text/plain); }); svr.listen(0.0.0.0, 8080); }Linux/macOS 编译时记得带上线程参数g -stdc11 -pthread -o demo demo.cpp -I. ./demo然后curl http://localhost:8080/ping看到pong闭环就完成了。想要 HTTPS把Server换成SSLServer构造函数传入证书和私钥路径即可httplib::SSLServer svr(./cert.pem, ./key.pem);客户端侧的写法同样直白httplib::Client cli(http://localhost:8080); if (auto res cli.Get(/ping)) { std::cout res-status : res-body \n; }res是个可选类型失败时为nullopt具体错误码在res.error()里包含连接超时、TLS 握手失败等细分情况排查网络问题时够用。仓库的 example/ 目录里有一组可直接编译的小样本simplesvr.cc、simplecli.cc是最小的服务端/客户端server_and_client.cc展示进程内两端对接ssecli.cc、wsecho.cc分别是 SSE 和 WebSocket 的最小示例。照抄改参数比看文档快。 能力清单从路由到 WebSocket下面按你大概率会用到的顺序过一遍核心 API。路由的三种写法。除了字符串路径cpp-httplib 的路由 pattern 同时支持正则和路径参数svr.Get(/users/:id, [](const httplib::Request req, httplib::Response res) { res.set_content(req.path_params.at(id), text/plain); }); svr.Get(R(/numbers/(\d)), [](const httplib::Request req, httplib::Response res) { res.set_content(req.matches[1], text/plain); });:id这种路径参数适合 RESTful 风格req.matches是正则捕获组。非标准方法比如 WebDAV 的PROPFIND可以用CustomRoute注册否则会被 400 拒绝。静态文件。一行挂载一个目录MIME 类型有内置映射表也可自行扩展svr.set_mount_point(/, ./www);嵌入式设备做 Web 管理界面基本就靠这一行加几个 API 路由。文件上传。multipart 数据被解析进req.form文本字段和文件分开取。有一个必须注意的安全点客户端传来的filename是不可信输入落盘前先过一遍httplib::sanitize_filename它会剥离路径分隔符、拒绝.和..防止目录穿越svr.Post(/upload, [](const httplib::Request req, httplib::Response res) { if (req.form.has_file(avatar)) { const auto f req.form.get_file(avatar); auto safe httplib::sanitize_filename(f.filename); // 写盘f.content 是完整内容 } });流式处理。上面整个文件进内存的默认路径对大文件不友好。换用带ContentReader的手写重载后body 和 multipart 数据都变成分块回调边收边处理内存占用与文件大小解耦。响应侧对称地有 content provider大文件下载不用先攒出完整 buffer。SSE 与 WebSocket。两个单向/双向实时通道都有独立支持SSE 见 README-sse.mdWebSocket 见 README-websocket.md。服务端在 GET 路由里检测升级请求即可建立 WebSocket 会话客户端有独立的ws::WebSocketClient。流式响应 API 另见 README-stream.md。中间件与钩子。请求生命周期上有两个插入点pre_routing_handler路由解析前适合鉴权这类早拒绝逻辑返回Handled直接短路和post_routing_handler路由完成后的统一后处理。配合res.user_data这个类型安全的 KV 存储pre 阶段解析出的认证上下文可以直接传给路由处理函数不用全局变量。用 cpp-httplib 做后端的 REST 接口驱动的一个翻译应用网页端摘自仓库 llm-app 文档TLS 细节。除了换后端库还提供自定义验证回调set_server_certificate_verifier可拿 SAN、issuer 等信息做策略判断、mTLSSSLServer/SSLClient构造函数接收客户端 CA / 客户端证书、内存 PEM证书不落地从 secrets 管理直接注入。macOS 上自动走 Keychain 系统证书Windows 走 CryptoAPI 校验链Linux 上需要自己set_ca_cert_path指向 CA bundle。⚖️ 边界与取舍选型前看清楚这部分决定了它适合不适合你比功能列表更重要阻塞 I/O 线程池。每个连接一个线程处理并发能力靠加线程。中等并发几百连接以内毫无压力高并发或长连接数多的场景比如上万设备同时挂在线的推送服务就别指望它了。只有 HTTP/1.1。对现代 CDN 后的 API 调用通常无感但如果你的服务端需要直接对接讲 h2 的下游就得自己评估。multipart 缓冲路径有上限。表单 part 数量默认上限 1024编译期宏可调超大、超多 part 的场景应走ContentReader流式路径。单文件是双刃剑。集成极简单但意味着全量代码进你的编译单元——模板重头文件会让编译时间明显变长大型工程里值得考虑放独立 TU。32 位平台不受支持安全报告不受理别用在 32 位目标上。同一个 cpp-httplib 服务作为桌面应用Qt 外壳的后端摘自仓库 llm-app 文档 往哪走仓库里现成的资源docs-src/pages/en/tour/ —— 9 篇渐进式教程从第一个客户端到WebSocket是最顺手的入门路径。docs-src/pages/en/cookbook/ —— 按主题拆的食谱文件上传、chunked 上传、进度回调、超时、代理、SSE、mTLS……每个文件一个问题适合当 API 手册查。example/ —— 可编译的最小示例集前面提过的simplesvr.cc、wsecho.cc、ssecli.cc都在里面。test/ —— 测试代码本身就是大型用法样本尤其是test.cc里对 TLS、超时、并发行为的断言比任何文章都精确。给你的落地建议先拿 example/simplesvr.cc 改出一个挂在你自己业务上的最小服务跑通curl验证再回头按需把 TLS 后端和路由钩子叠上去——比先读完文档再动手效率高得多。【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考