
用 C++ 写 Web 框架不常见,但并非不能——适合对性能、控制力要求高的场景(比如高频 API 网关、嵌入式服务、游戏后端)。Crow 和 Pistache 是两个轻量、现代、头文件为主、无重型依赖的主流选择。入门门槛不高,关键在理解“路由 + 处理器 + 响应”这个最小闭环。
选 Crow 还是 Pistache?看这三点
Crow:基于 Boost.Beast(底层用 ASIO),语法极简,类似 python flask,单头文件(crow.h),编译快,调试友好,适合快速原型和教学。
Pistache:纯 C++17 实现,异步非阻塞(基于 epoll/kqueue),自带线程池和 http/1.1 解析器,更“系统级”,适合高并发部署,但需链接 -lpistache,构建稍复杂。
- 想 5 分钟跑起一个 GET 接口 → 选 Crow
- 要处理几千并发连接且不想引入 Boost → 选 Pistache
- 项目已用 CMake + Conan/Vcpkg → 两者都容易集成
用 Crow 写第一个 Hello World
#include "crow.h" int main() { crow::Simpleapp app; CROW_ROUTE(app, "/")([](){ return "Hello from Crow!"; }); CROW_ROUTE(app, "/user/")([](int id){ return crow::response("User ID: " + std::to_string(id)); }); app.port(8080).multithreaded().run(); }
编译命令(g++ 7.5+):
g++ -std=c++17 -pthread main.cpp -o server
运行 ./server,curl http://localhost:8080 就能看到响应。
用 Pistache 写一个 jsON API
先安装(ubuntu):
sudo apt install libpistache-dev
或用 vcpkg:
vcpkg install pistache:x64-linux
代码示例(api.cpp):
#include #include #include #include #include using namespace Pistache; using json = nlohmann::json; auto helloHandler = Http::Handler([](const Http::Request& req, Http::ResponseWriter response) { json j = {{"message", "Hello from Pistache!"}, {"status", 200}}; response.send(Http::Code::Ok, j.dump()); }); int main() { Address addr(Ipv4::any(), Port(8080)); auto opts = Http::Endpoint::options().threads(4); Http::Endpoint server(addr); server.init(opts); server.setHandler(router); auto router = std::make_shared(); router->addRoute(Http::Get("/"), helloHandler); server.serve(); }
编译:
g++ -std=c++17 -O2 api.cpp -o api -lpistache -ljsoncpp
- Pistache 默认异步,threads(4) 控制工作线程数
- 需手动集成 JSON 库(推荐 nlohmann/json)
- 所有 handler 必须是 Http::Handler 类型,传入 request/response 对象
进阶建议:别跳过这三件事
刚跑通不代表能用于项目。以下实践能避开 80% 的坑:
立即学习“C++免费学习笔记(深入)”;
- 加中间件:Crow 用 app.before_handle 记录日志或校验 Token;Pistache 用 router->addGuard 做统一鉴权
- 静态文件支持:Crow 用 CROW_ROUTE(app, “/Static/
“) + 文件读取;Pistache 推荐用 StaticHandler 类或 nginx 前置 - 避免裸 new/delete:所有 handler lambda 捕获变量用 [=] 或显式值捕获,别用 [&] 引用栈对象(生命周期错配易崩溃)
基本上就这些。不复杂但容易忽略——C++ Web 的核心不是“怎么写路由”,而是“怎么管好内存、线程和错误传播”。跑起来只是开始,稳住才是关键。