一个头文件让 C++ 程序变成 Web 服务:cpp-httplib 上手指南
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
如果你需要给 C++ 程序加一个 Web 接口,或者让你的程序去调用其他服务的 HTTP API,cpp-httplib 是个省时间的选择:它把 HTTP/HTTPS 服务器和客户端装进一个httplib.h头文件,支持 C++11,不用配置构建系统,包含即用。对想快速搭原型、给设备加管理页的开发者来说,这个库的接入成本几乎为零。
你大概遇到过这种麻烦:程序跑起来了,数据却无处可看
真实的需求往往很具体:服务已经在跑,你想临时对外加几个数据接口;或者你在做设备,需要一个小管理页面。常规做法是引入 Web 框架,配好一整套依赖,但你真正用到的不过十几条路由和几个静态文件——框架的开销远超收益。
cpp-httplib 就是为这类场景准备的。服务器和客户端代码全在一个头文件里,没有子模块、没有第三方依赖,把文件拷进工程就能开始写。REST 接口、轻量 Web 界面、服务之间的互相调用,一个头文件都够。
官方文档里就用它完整搭了一个翻译应用,网页版可以直接在浏览器里访问:
从克隆仓库到看到第一个响应
整个过程分三步,几分钟内可以走完。
先拿代码:
git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib如果你只需要核心功能,单独拷走httplib.h这一个文件就行,全部能力都在里面。
然后写个最小服务,存成server.cpp:
#include "httplib.h" int main() { httplib::Server svr; svr.Get("/", [](const httplib::Request&, httplib::Response& res) { res.set_content("来自 cpp-httplib 的第一个响应", "text/plain"); }); svr.listen("0.0.0.0", 8080); }库内部会开线程,编译时记得带上线程参数:
g++ -std=c++11 -pthread -o server server.cpp # Linux / macOS cl /EHsc /std:c++11 server.cpp # Windows MSVC浏览器访问http://localhost:8080,看到吐出的文字就说明跑通了。客户端也是同一套写法:httplib::Client cli("http://localhost:8080")之后调用cli.Get("/"),res->status和res->body就是响应内容,阻塞式调用,读起来像普通函数。
四个让你省掉另找库的能力
服务器和客户端共用一套动词,心智模型不用切换
路由定义写svr.Get("/path", handler),发请求写cli.Get("/path"),两边一一对应,POST、PUT、DELETE都按同样方式成对出现。写完一边就能推断另一边,不用记两套 API。
HTTPS 只差一个宏
在包含头文件之前定义支持宏,SSLServer和SSLClient就可用了。OpenSSL 之外还支持 Mbed TLS 和 wolfSSL,换宏即可切换,嵌入式环境里后两者常常是更合适的选择:
#define CPPHTTPLIB_OPENSSL_SUPPORT #include "httplib.h" // 拿证书与私钥文件启动 HTTPS 服务 httplib::SSLServer svr("./cert.pem", "./key.pem");托管静态目录只需一行配置
一句svr.set_mount_point("/", "./web_root"),URL 路径就映射到目录下的对应文件。给设备做管理页、搭内网小工具,这是"先有个页面看"最快的路径。
WebSocket 与 SSE 内置,实时场景不用另找库
需要持续往外推数据的场景,库原生覆盖两套协议:服务端可以把连接升级为 WebSocket 做全双工通信,也可以按 SSE(服务器推送事件)协议持续发事件,前端用标准事件流接收即可。实时那块不用再去翻别的依赖。
上生产之前,先把这些红线说清楚 ⚠️
这个库的哲学是简单优先,以下取舍最好在看代码之前就明白:
- 阻塞式 I/O 模型。socket 是阻塞的,如果目标是每连接一条协程的极致高并发,它不是最优解。
- 只支持 HTTP/1.1。HTTP/2 和 HTTP/3(QUIC)都没有实现,链路如果强依赖多路复用或 0-RTT,请另选方案。
- 不支持 32 位平台。官方只对 64 位环境做保障,32 位环境没有安全验证。
生产环境务必走 HTTPS,并正确配置证书校验,别随手关掉验证。客户端拿到响应后检查返回值,失败时可以从res.error()里取原因。库以 C++11 为基线,用 C++17 写更顺手;Windows、Linux、macOS 与 GCC、Clang、MSVC 均可运行,注意编译器版本。
进阶钩子与遇到问题时的资源入口
两个用到就顺手的写法:
路由前的统一拦截。用set_pre_routing_handler在请求进入具体路由前统一做鉴权、限流或日志,返回Handled直接短路响应:
svr.set_pre_routing_handler([](const httplib::Request& req, httplib::Response& res) { if (!authorized(req)) { res.status = 401; return httplib::Server::HandlerResponse::Handled; } return httplib::Server::HandlerResponse::Unhandled; });处理文件上传。multipart 表单里的字段可以直接读取,req.get_file_value("file")拿到文件内容与文件名后按需落盘即可。
卡住时可以翻这些入口:
- 源码与内联注释:httplib.h,函数名和参数都写得很清楚
- 可运行示例:example/,
server.cc、client.cc、wsecho.cc、upload.cc等独立小例子,照着改最快 - 入门教程:docs-src/pages/en/tour/,按客户端 → 服务器 → TLS → WebSocket 的顺序讲
- 进阶食谱:docs-src/pages/en/cookbook/,覆盖鉴权、压缩、超时、日志等常见坑
- WebSocket 与 SSE 专篇:README-websocket.md、README-sse.md
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考