Crow — C++ 微框架
Crow 是受 Python Flask 启发的 C++ Web 微框架,语法简洁,支持中间件、WebSocket、模板,适合快速构建 REST API。
安装
bash
# vcpkg
vcpkg install crowcpp-crow
# CMake
find_package(Crow REQUIRED)
target_link_libraries(myapp PRIVATE Crow::Crow)快速开始
cpp
#include "crow.h"
int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/")([]() {
return "Hello, Crow!";
});
// JSON 响应
CROW_ROUTE(app, "/api/hello")([](const crow::request& req) {
crow::json::wvalue json;
json["message"] = "Hello, World!";
json["version"] = "1.0";
return crow::response(json);
});
// 路径参数
CROW_ROUTE(app, "/users/<int>")([](int id) {
crow::json::wvalue json;
json["id"] = id;
json["name"] = "Alice";
return crow::response(json);
});
// 多类型参数
CROW_ROUTE(app, "/items/<string>/<int>")
([](std::string category, int id) {
return category + "/" + std::to_string(id);
});
app.port(8080).multithreaded().run();
}HTTP 方法
cpp
crow::SimpleApp app;
// GET
CROW_ROUTE(app, "/api/users").methods(crow::HTTPMethod::GET)
([](const crow::request& req) {
auto page = req.url_params.get("page");
crow::json::wvalue result;
result["page"] = page ? std::stoi(page) : 1;
return crow::response(result);
});
// POST
CROW_ROUTE(app, "/api/users").methods(crow::HTTPMethod::POST)
([](const crow::request& req) {
auto body = crow::json::load(req.body);
if (!body) return crow::response(400, "Invalid JSON");
std::string name = body["name"].s();
int age = body["age"].i();
crow::json::wvalue resp;
resp["id"] = 1;
resp["name"] = name;
resp["age"] = age;
return crow::response(201, resp);
});
// PUT / DELETE
CROW_ROUTE(app, "/api/users/<int>")
.methods(crow::HTTPMethod::PUT, crow::HTTPMethod::DELETE)
([](const crow::request& req, int id) {
if (req.method == crow::HTTPMethod::DELETE) {
return crow::response(204);
}
// PUT 处理...
return crow::response(200);
});中间件
cpp
// 定义中间件
struct AuthMiddleware {
struct context {};
void before_handle(crow::request& req, crow::response& res, context& ctx) {
auto auth = req.get_header_value("Authorization");
if (auth.empty() || !verify_token(auth)) {
res.code = 401;
res.write("Unauthorized");
res.end();
}
}
void after_handle(crow::request& req, crow::response& res, context& ctx) {
res.add_header("X-Powered-By", "Crow");
}
};
struct LogMiddleware {
struct context { std::chrono::steady_clock::time_point start; };
void before_handle(crow::request& req, crow::response& res, context& ctx) {
ctx.start = std::chrono::steady_clock::now();
}
void after_handle(crow::request& req, crow::response& res, context& ctx) {
auto elapsed = std::chrono::steady_clock::now() - ctx.start;
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
CROW_LOG_INFO << req.method_string() << " " << req.url << " "
<< res.code << " " << ms << "ms";
}
};
// 使用中间件
crow::App<LogMiddleware, AuthMiddleware> app;
CROW_ROUTE(app, "/api/secret")([]() {
return "Secret data";
});
app.port(8080).run();WebSocket
cpp
#include "crow.h"
int main() {
crow::SimpleApp app;
// WebSocket 连接管理
std::mutex mtx;
std::vector<crow::websocket::connection*> clients;
CROW_WEBSOCKET_ROUTE(app, "/ws")
.onopen([&](crow::websocket::connection& conn) {
std::lock_guard lock(mtx);
clients.push_back(&conn);
CROW_LOG_INFO << "新连接: " << conn.get_remote_ip();
})
.onclose([&](crow::websocket::connection& conn, const std::string& reason) {
std::lock_guard lock(mtx);
clients.erase(std::remove(clients.begin(), clients.end(), &conn),
clients.end());
})
.onmessage([&](crow::websocket::connection& conn,
const std::string& data, bool is_binary) {
// 广播给所有客户端
std::lock_guard lock(mtx);
for (auto* c : clients) {
c->send_text(data);
}
});
app.port(8080).run();
}静态文件与模板
cpp
// 静态文件服务
CROW_ROUTE(app, "/static/<path>")([](const std::string& path) {
auto res = crow::response();
res.set_static_file_info("./public/" + path);
return res;
});
// Mustache 模板
CROW_ROUTE(app, "/hello/<string>")([](const std::string& name) {
auto page = crow::mustache::load("hello.html");
crow::mustache::context ctx;
ctx["name"] = name;
return page.render(ctx);
});关键认知
Crow 的语法最接近 Flask/Express,学习成本极低。中间件系统通过模板参数组合,零运行时开销。适合快速构建 REST API 和内部工具,生产高并发场景考虑 Drogon。