1个头文件跑通HTTP服务:3分钟玩转cpp-httplib
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
你有没有遇到过这种情况:C++服务想暴露几个HTTP接口给监控、前端或别的系统调用,可引入一个大框架成本太高——构建系统要动、依赖要装,等把第一个"Hello World"跑起来,半天就过去了。要是包含一个头文件就能拿到完整的HTTP/HTTPS服务器和客户端,会不会划算?cpp-httplib 做的就是这件事:一个C++11的单文件header-only HTTP/HTTPS库,服务器和客户端都装在同一个httplib.h里。
和常规做法比,它到底不同在哪
整个库就是一个头文件。把httplib.h丢进工程就能编译,不用动CMake,不用装包管理器,不用管链接。复制一个文件到Linux、Windows或macOS的任意项目里,都能直接编。这和那些需要"clone-configure-make"三件套的框架,是两种量级的接入成本。
功能集是全的,不是残缺版。除了HTTP服务器和客户端,WebSocket、SSE(服务端事件流)、multipart文件上传也都在这个文件里。做实时推送、流式日志时,你不需要再补一个库。
HTTPS是可选项,不是门槛。启用SSL/TLS只需在包含头文件前定义一个宏,OpenSSL、Mbed TLS、wolfSSL都能接;不用时纯HTTP版本零外部依赖。
从clone到看到响应,最快的路径
拿代码一条命令:
git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib仓库里 example/ 有一整套示例,但想看到效果,自己写一个更直接,关键只有一点:httplib.h要在包含路径里:
#include "httplib.h" int main() { httplib::Server svr; svr.Get("/", [](const httplib::Request&, httplib::Response& res) { res.set_content("Hello cpp-httplib!", "text/plain"); }); svr.listen("0.0.0.0", 8080); return 0; }用g++ -std=c++11 -pthread -o server server.cpp编译后运行,浏览器打开8080端口就能看到响应文本。没有构建文件,没有依赖,没有配置。客户端要发请求也一样:httplib::Client cli("http://主机:8080")之后直接cli.Get("/path")。是的,就这么简单。
深讲两个最值得记住的能力
你可能会问:就一个文件,文件上传、实时连接这种麻烦事真能扛?至少不用你手写协议解析。
multipart文件上传。这是C++后端最容易头疼的点——手动解析boundary和内容长度,写起来全是坑。cpp-httplib把它包成了几个方法调用(以下为片段):
svr.Post("/upload", [](const httplib::Request& req, httplib::Response& res) { if (req.form.has_file("file")) { const auto f = req.form.get_file("file"); std::ofstream ofs(f.filename, std::ios::binary); ofs << f.content; res.set_content("上传成功", "text/plain"); } });关键在multipart数据已经被解析进req.form,文件名和字节流直接取。注意文件内容是整段放在内存里的,要处理大文件时应该换成流式接口(Post/Put也接受带ContentReader的handler)边收边落盘。
WebSocket实时连接。管理页面要推实时日志或状态,再注册一个路由就行(以下为片段):
svr.WebSocket("/ws", [](const httplib::Request&, httplib::ws::WebSocket& ws) { std::string msg; while (ws.read(msg)) { ws.send("echo: " + msg); } });这个handler是在阻塞读循环里跑的,连接不断开就不会返回,所以每个连接的处理逻辑要写进循环内部。配合上面那份静态页面,一个实时管理端就齐了。
走一遍场景:给物联网网关加个Web管理页
设想一个家里的物联网网关,7×24跑着,半夜状态异常时你总不能SSH上去看——需要个Web管理页,能看设备状态,也能远程触发重启。
思路不复杂:静态目录托管管理页面(HTML+JS),再配两个API给页面调用(以下为片段):
httplib::Server svr; svr.set_mount_point("/", "./web_ui"); // 静态管理页 svr.Get("/api/status", [](const httplib::Request&, httplib::Response& res) { res.set_content(R"({"cpu":32,"uptime":"3d"})", "application/json"); }); svr.Post("/api/restart", [](const httplib::Request&, httplib::Response& res) { // 这里触发真实的重启逻辑 res.status = 202; }); svr.listen("0.0.0.0", 8080);set_mount_point一行之后,web_ui 目录下的文件就都是可直接访问的URL,页面里的JS用fetch调/api/status渲染数据,管理页就成了。重启接口返回202而不是等执行完,避免页面请求被拖住。写完之后,你的网关管理页就是下面这种形态——静态页面和REST接口全部来自同一个头文件:
说句公道话:适合什么,不适合什么
cpp-httplib 用的是阻塞式socket I/O,只支持HTTP/1.1,没有HTTP/2和HTTP/3。管理页、原型、服务间互调,性能绑绑有余;高并发网关或者必须上HTTP/2的场景,它不合适。官方README也明确不支持32位平台,记得跑在64位上。它的定位更接近"能直接上生产的单头文件",而不是高性能Web框架——想清楚这条线,选型就好做了。
接着看什么
- README.md:完整功能清单和各TLS后端的编译开关
- example/:服务器、客户端、上传、WebSocket、SSE的完整示例
- README-websocket.md、README-sse.md:实时通信的详细用法
- docs-src/pages/en/tour/:从入门到HTTPS配置的教程系列
C++项目里需要HTTP的时候,复制一个头文件试一下就行——十几行代码的成本,试错基本为零。
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考