在C++生态中,编写Web服务不再需要从零处理socket和HTTP解析。Crow和Pistache是两个轻量且流行的框架,能让我们用很少的代码启动一个HTTP服务。Crow语法接近Flask,适合快速原型;Pistache采用异步REST设计,更偏向工程化控制。

一、Crow框架入门
1.1 环境准备与编译
Crow是头文件-only的框架,核心依赖Boost和线程库。我们可以从源码直接包含,无需复杂安装。以Ubuntu为例,需先安装Boost库,再将Crow的crow.h放入项目包含路径。
下面是一段最简的编译命令,使用g++并开启C++11与线程支持。由于Crow依赖Asio做网络IO,链接时需要指定-lpthread与Boost系统库。实际项目中也可用CMake管理,但头文件模式让单文件 demo 异常方便。
// 编译: g++ -std=c++11 -o server server.cpp -lpthread -lboost_system
#include <crow.h>
int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/")([](){
return "Hello from Crow";
});
app.port(8080).multithreaded().run();
return 0;
}
1.2 路由与JSON响应
Crow通过CROW_ROUTE宏绑定URL与处理函数,函数可返回字符串、JSON或自定义响应。借助crow::json::wvalue能轻松构造JSON,适合写API。
下面的例子演示了路径参数与JSON返回。当访问/user/123时,框架提取id并回传结构化数据。这种声明式路由让接口清晰,且运行期开销极低,因为路由表在启动前就静态生成。
#include <crow.h>
int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/user/<int>")([](int id){
crow::json::wvalue res;
res["id"] = id;
res["name"] = "test";
return crow::response(res);
});
app.port(8080).run();
}
二、Pistache框架入门
2.1 基本概念与依赖
Pistache使用异步REST风格,核心类是Pistache::Rest::Router与Pistache::Http::Endpoint。它需要单独编译安装,提供更明确的线程池与传输层配置。
相比Crow的宏,Pistache用函数绑定路由,更适合大型项目分层。它内置对HTTPS、文件服务的支持,但学习曲线略陡。下面展示最小HTTP服务,监听本地8080并回复文本。
#include <pistache/endpoint.h>
#include <pistache/router.h>
using namespace Pistache;
class HelloHandler : public Http::Handler {
public:
HTTP_PROTOTYPE(HelloHandler)
void onRequest(const Http::Request&, Http::ResponseWriter writer) override {
writer.send(Http::Code::Ok, "Hello from Pistache");
}
};
int main() {
Http::Endpoint server(Address(Ipv4::any(), Port(8080)));
auto opts = Http::Endpoint::options().threads(2);
server.init(opts);
server.setHandler(Http::make_handler<HelloHandler>());
server.serve();
}
2.2 路由与参数处理
Pistache的Router支持变量路由与过滤器。以下示例用Router将/api/<name>映射到处理函数,并从查询串读取参数。它的设计强调不可变请求对象,便于多线程安全。
在真实业务中,我们通常把Handler与Router分离,Router负责匹配,Handler负责逻辑。这样单元测试时可直接调用Handler,而不依赖网络。下面代码显示如何读取路径与查询参数并返回JSON风格文本。
#include <pistache/router.h>
#include <pistache/endpoint.h>
using namespace Pistache;
void printName(const Rest::Request& req, Http::ResponseWriter writer) {
auto name = req.param(":name").as<std::string>();
auto age = req.query().get("age").getOrElse("0");
writer.send(Http::Code::Ok, "name=" + name + ",age=" + age);
}
int main() {
Rest::Router router;
Rest::Routes::Get(router, "/api/:name", Rest::Routes::bind(&printName));
// 省略Endpoint绑定代码,实际需将router绑定到Http::Endpoint
}
三、框架对比与选型建议
3.1 易用性与性能
Crow因头文件与宏路由,写小型demo几乎无配置成本,且基于Asio的事件循环性能优秀。Pistache需要编译与类继承,但提供细粒度线程与传输控制,更适合长生命周期服务。
从社区活跃度看,Crow更新频繁、示例多;Pistache偏向稳定,API变动小。若项目要求快速验证想法,Crow更顺手;若需嵌入现有C++服务并统一网络层,Pistache更合适。
| 维度 | Crow | Pistache |
|---|---|---|
| 安装方式 | 头文件包含 | 库编译安装 |
| 路由风格 | 宏+lambda | Router绑定 |
| 并发模型 | 多线程事件循环 | 异步+线程池 |
3.2 实践注意点
使用Crow时需注意全局SimpleApp的生命周期,避免在信号处理中直接退出导致socket未释放。Pistache则要注意Handler必须是轻量且线程安全的,因为同一Handler实例可能被多线调用。
两个框架都不带完整ORM或模板引擎,若做网页渲染需自行接入。但对于纯API或物联网网关,它们能以极小体积提供稳定HTTP能力,是C++后端值得尝试的入门路径。