cpp-httplib 请求追踪怎么接:三步跑通,附常见坑
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
cpp-httplib 是一个 C++ header-only 的 HTTP/HTTPS 服务端与客户端库,全库就一个头文件。给服务加请求追踪是它的高频使用场景:接口上线后,某个请求慢了、报了 4xx,如果日志里只有"收到过请求",排查起来只能靠猜。下面演示怎么用库自带的两个钩子,把"谁在什么时候请求了什么、花了多久、返回什么状态"记下来。
三步跑通:给 cpp-httplib 服务加上请求追踪日志
- 拿到库。cpp-httplib 是 header-only,只需要
httplib.h这一个文件(可从仓库 https://gitcode.com/GitHub_Trending/cp/cpp-httplib 克隆)。 - 建一个最小服务文件,注册两个钩子:
set_logger记每个请求的结果,set_pre_request_handler在路由前做拦截检查。
#include <httplib.h> #include <chrono> #include <cstdio> int main() { httplib::Server svr; svr.Get("/hello", [](const httplib::Request&, httplib::Response& res) { res.set_content("hello", "text/plain"); }); svr.set_logger([](const httplib::Request& req, const httplib::Response& res) { std::printf("%s %s -> %d\n", req.method.c_str(), req.path.c_str(), res.status); }); svr.listen("0.0.0.0", 8080); }这段代码做了什么:注册一个/hello路由,并给服务挂了一个 logger 回调,每当一个请求处理完,就打印方法、路径和状态码。
- 编译运行(
g++ -O2 -pthread -o svr svr.cc),再发一个请求验证。
curl http://localhost:8080/hello curl -o /dev/null -w "%{http_code}\n" http://localhost:8080/missing这两条 curl 分别打一个正常路由和一个不存在的路径,用来观察 200 和 404 在日志里的表现。
日志里能看到什么,为什么是这些
跑起来后终端会输出:
[2026-09-09 13:35:02] "GET" "/hello" 200 0.12ms [2026-09-09 13:35:02] "GET" "/hello" 200 0.08ms [2026-09-09 13:35:03] "GET" "/missing" 404 0.09ms [2026-09-09 13:35:03] "GET" "/missing" 404 0.07ms(以上为按日志格式整理的示意输出。)
机制其实很简单:set_logger的回调在响应定稿之后触发,所以回调里的res.status一定是最终状态码,想记耗时就在回调里自己用steady_clock打点。set_pre_request_handler则在路由匹配之后、请求体读取之前运行,适合在这里做鉴权或限流——返回Handled直接短路请求,连 body 都不用读;返回Unhandled就放行给真正的路由 handler。
新手最容易踩的坑
在 pre_request_handler 里读 req.body → 拿到的是空串 → 该阶段 body 还没读,改用 req.path_params、query 参数或请求头做判断:
svr.set_pre_request_handler([](const auto& req, auto& res) { if (req.path_params.count("user") && req.path_params.at("user") != "john") { res.status = 403; return httplib::Server::HandlerResponse::Handled; } return httplib::Server::HandlerResponse::Unhandled; });这段代码做了什么:路由匹配后先校验路径参数,不合法直接返回 403 拦截,合法则返回Unhandled放行。
handler 里忘了返回 Unhandled → 要么编译报"缺少返回值",要么意图和实际行为不一致 → 每个分支都显式写 return HandlerResponse::Unhandled(放行)或 Handled(拦截)。
keep-alive 长连接下 logger 调用频繁 → 日志回调里写库、做阻塞 IO,拖慢后续请求 → 回调只做轻量输出,重活丢给后台线程。
继续往下走
- README 的 "Handler execution order" 一节,README.md 里用一张流程图列出了各 handler 的完整执行顺序。
- 可运行的服务示例,包括 logger 写法:example/server.cc。
- 官方文档站点源码,cookbook 按主题分节:docs-src/pages/en/cookbook/。
把这两个钩子用熟,请求级追踪就已经够用了;需要跨服务串联时,再考虑在 pre_request_handler 里解析标准追踪头。
【免费下载链接】cpp-httplibA C++ header-only HTTP/HTTPS server and client library项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考