开篇
项目里突然要加个HTTP接口,你会怎么做?搭Nginx配置一堆参数?用libcurl手写Server逻辑?其实有个更简单的办法——只要一个.h文件,3行代码就能跑起来。这个15.2k Star的C++库,可能是你见过最省事的HTTP方案。
什么是cpp-httplib
这是一个纯C++11写的HTTP/HTTPS库,最大的特点就是Header-Only——整个库就一个头文件,复制到项目里直接include,不用编译、不用链接、不用装依赖。
基本信息:
- 代码量约1万行
- 支持HTTP/1.1和HTTPS
- 跨平台(Linux/Windows/macOS)
- 同时提供Server和Client
三分钟跑起来
写个Server
#include "httplib.h"
httplib::Server svr;
svr.Get("/api/user", [](const auto& req, auto& res) {
res.set_content("{\"name\":\"张三\"}", "application/json");
});
svr.listen("0.0.0.0", 8080);
C++服务器开发
黑马最新就业课程 https://yunpan.plus/t/447-1-1
写个Client
httplib::Client cli("http://api.example.com");
auto res = cli.Get("/data");
if (res && res->status == 200) {
std::cout << res->body;
}
代码就这么多,编译运行就能用。
技术实现
I/O模型
用的是阻塞Socket + 多线程,一个连接分配一个线程。这种方案虽然扛不住海量并发,但在中小规模场景下反而更稳定,出了问题也好排查。
代码结构
分两层:
- 应用层:封装Request/Response对象
- 传输层:Stream抽象(SSL和非SSL用同一套接口)
通过Stream这层抽象,SSL相关的代码和普通HTTP完全复用,只在初始化时切换具体实现。
路由功能
支持正则匹配:
svr.Get(R"(/users/(\d+))", [](const auto& req, auto& res) {
auto user_id = req.matches[1];
// 处理逻辑
});
SSL集成
内置OpenSSL 3.0+支持:
- 双向TLS认证
- 自定义证书校验
- macOS会自动加载系统证书链
适合什么场景
适合用的地方:
- 微服务之间的内部调用
- 写爬虫或API测试工具
- 嵌入式设备的Web管理界面
- 快速验证想法做原型
不适合的地方:
- 面向公网的高并发服务
- 需要长连接或WebSocket
- 对性能要求极致的场景
几个亮点
零依赖
不需要CMake、不需要装库(SSL可选),复制头文件就行。对于赶进度的项目来说,这点太重要了。
错误处理分层
cli.error() // HTTP层错误(超时、连接失败)
cli.ssl_error() // SSL握手错误
cli.ssl_openssl_error() // 证书验证错误
三层错误码,定位问题很方便。
连接复用
Client端自动管理Keep-Alive,减少TCP握手次数。
性能表现
实测数据(4核8G单机):
- QPS大概5000-8000(短连接)
- 并发连接建议控制在1000以内
结论就是:中小规模够用,但别指望它扛百万并发。技术选型本来就是权衡,不是所有服务都得上异步框架。
使用建议
几个实战经验:
- 生产环境:前面最好放个Nginx做负载均衡和SSL卸载
- 线程池:根据业务调整
set_thread_pool_count()
- 超时设置:一定要设
set_read_timeout(),防止慢客户端攻击
- 日志对接:用
set_logger()接入现有日志系统
总结
cpp-httplib就做一件事:让你用最简单的方式集成HTTP能力。不追求大而全,但在易用性上做到了极致。如果项目需要轻量级的HTTP功能,这个库值得一试。
关注《云栈后端架构》,每周分享优质开源项目和架构实践
📦 项目地址
https://github.com/yhirose/cpp-httplib
📖 C++学习路线图
https://yunpan.plus/t/465-1-1
📖 C++服务器开发
https://yunpan.plus/t/447-1-1
标签:#cpp-httplib #Github #C++ #HTTP服务 #开源项目 #后端开发 #微服务