Skip to content

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。

系统学习 C++ 生态,深入底层架构