news 2026/9/10 9:31:02

cpp-httplib:给 C++ 服务加个 HTTP 接口的最轻路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cpp-httplib:给 C++ 服务加个 HTTP 接口的最轻路径

cpp-httplib:给 C++ 服务加个 HTTP 接口的最轻路径

【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib

你的 C++ 服务要暴露一个健康检查接口给监控系统,不想为这一件事引入整个 Web 框架。cpp-httplib 就是干这个的:一个 C++11 单文件头文件库,把 httplib.h 拷进项目,十几行代码起一个真正能用的 HTTP 服务,客户端也是同一套 API 写出来的。

🧩 它到底是什么

cpp-httplib 是货真价实的 header-only 库:整个仓库只有一个核心文件 httplib.h,两万多行 C++,服务器和客户端全在里面。形态上简单到把头部文件放进 include 路径、include 一下就行,没有构建脚本,没有第三方依赖,编译只需要标准库加 -pthread。架构上很直白:阻塞式 socket I/O,外加内置线程池派发请求。README 第一页就写明,找非阻塞异步库的别来,它只支持 HTTP/1.1,没有 HTTP/2 和 3。这个取舍反而让行为可预期、好排查,出问题不用猜异步回调链。兼容性是另一个卖点:Windows、Linux、macOS 都能跑,GCC、Clang、MSVC 都能编,最低 C++11,官方教程示例用的是 C++17。

跑起来看看:一条命令编出 HTTP 服务

我本地走了一遍,全程没碰构建系统。先拿代码:

git clone https://gitcode.com/GitHub_Trending/cp/cpp-httplib

server.cpp 内容就这些:

#include "httplib.h" int main() { httplib::Server svr; svr.Get("/", [](const httplib::Request&, httplib::Response& res) { res.set_content("ok", "text/plain"); }); svr.listen("0.0.0.0", 8080); }

Linux 编译要加 -pthread,它内部用到了线程:

g++ -std=c++11 -pthread -I cpp-httplib -o server server.cpp ./server

然后 curl 一下 127.0.0.1:8080,返回就是 ok。本地编译没有任何告警,响应头里还带 Server: cpp-httplib/0.54.1 的标识,一眼认得出。

几个你大概率会用到的能力

一行命令挂上静态文件目录

嵌入场景里最常见的是一个小 web 管理界面。一行 set_mount_point("/ui", "./web_ui"),整个目录就能被直接访问,内置的扩展名到 MIME 映射足够全,连 wasm、woff2 都在。我挂了个本地目录验证过,立刻生效,连目录索引都不用自己写。

路径参数与正则路由,不自己切 URL

注册 svr.Get("/users/:id", ...),处理器里用 req.path_params.at("id") 取 id。想更灵活就直接上正则 R"(/numbers/(\d+))",捕获组落在 req.matches 里。查询参数、请求头也都挂在 Request 对象上,取法一致,风格统一。

同一个文件里把 HTTP 客户端也写了

httplib::Client cli("http://user-service:8080") 构造,cli.Get("/users/123") 发请求。返回值是可选指针,请求没发出去时还能拿到具体错误码。微服务之间调接口、监控脚本里探活,都够用。想要实时一点的 WebSocket、SSE 也有,根目录各有一篇专门的 README 可以连起来读。官方文档还给了个完整参照:llm-app 章节用这个库从 REST 接口一路搭到浏览器界面,是个翻译应用,桌面端跑起来长这样:

用起来之前要知道的事

线程模型决定了并发上限

每个连接由线程池里一个线程服务,默认池子大小是 max(8, 核数-1),上限四倍,空闲 3 秒回收。控制接口、健康检查、内部工具完全够用;高并发网关它确实不是最优解,但内部系统这个模型足够。要调整就编译前定义 CPPHTTPLIB_THREAD_POOL_COUNT 宏,一行搞定。

不少能力要编译期宏才点亮

HTTPS 得先选 OpenSSL、Mbed TLS 或 wolfSSL 其中一个做后端,在 include 头部文件前 define CPPHTTPLIB_OPENSSL_SUPPORT,SSLServer、SSLClient 这些类型才存在。gzip 压缩同理依赖 zlib。不点亮宏,对应功能直接缺席,连编译错误都省了,上手前最好知道自己要不要开。

32 位平台官方明确不支持

README 写得很直白:可能编得过,但没有做过安全审查,只影响 32 位的问题会直接关闭。目标环境是 32 位嵌入式的话,建议绕开。另外静态文件服务那几个方法不是线程安全的,运行中频繁挂卸目录要自己控制。

文档、示例和用法参考在哪

  • 官方教程:docs-src/pages/en/tour/ 目录 9 篇,从第一个服务一路讲到 TLS 配置。
  • 可编译示例:example/ 目录二十多个现成程序,WebSocket、SSE、分块上传都有。
  • 用法参考:test/ 目录的测试用例比教程更细,是查 API 用法的最好入口。

回到开头那个健康检查接口:低中并发的管控接口、监控探针、嵌入式设备管理界面、内部服务间的 HTTP 调用,选它就够了。面向公网的高 QPS 网关,或者必须 HTTP/2,它不是为你准备的,README 开头也会这么告诉你。

【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 9:30:33

CANN/GE图引擎获取资源标记API

GetMarks 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的…

作者头像 李华
网站建设 2026/9/10 9:29:58

粒子群算法在永磁同步电机多参数辨识中的Simulink仿真实现

基于粒子群算法的永磁同步电机多参数辨识研究(Simulink仿真实现)做了这么多年电机控制,我越来越觉得参数辨识这件事被严重低估了。很多同行做矢量控制,PI参数全靠试,或者用工程经验法估一组,电机换一台就重…

作者头像 李华
网站建设 2026/9/10 9:27:45

MyBatis-Plus速成实战:从CRUD到分页、逻辑删除与乐观锁

我最早接触MyBatis-Plus是在刚接手一个老后端项目的时候。那会儿项目里有二十多张表,每新增一张表,都要先写一遍Mapper接口、XML文件里的insert、delete、update、selectById,再补两个多条件查询——光这部分机械重复的代码,就能耗…

作者头像 李华