Crow介绍及使用
1.Crow是什么
Crow 是一个轻量级、高性能的 C++ Web 框架,专为快速构建 RESTful API 和 Web 应用而设计。它采用现代 C++(C++11 及以上)编写,以简洁的语法和易用性著称,适合需要高效网络服务的 C++ 开发者。
Crow 的核心特点
-  简洁的 API 设计 -  类似 Python Flask 的路由语法,直观易用。 
-  示例:定义一个简单的路由只需几行代码:1. #include <crow.h> int main() {crow::SimpleApp app;CROW_ROUTE(app, "/")([](){ return "Hello, Crow!"; });app.port(8080).run(); }
 
-  
-  无第三方依赖 -  仅需 C++ 标准库,无需额外安装依赖(但需支持 C++11 的编译器,如 GCC/Clang/MSVC)。 
 
-  
-  高性能 -  基于异步 I/O(依赖平台的原生实现,如 Linux 的 epoll),适合高并发场景。
 
-  
-  内置功能 -  支持 HTTP/1.1、路由、中间件、JSON 请求/响应、WebSocket 等常见功能。 
 
-  
-  易集成 -  可轻松嵌入现有 C++ 项目,或与其他库(如数据库驱动)配合使用。 
 
-  
2.Web 框架(Web Framework)是什么?
Web 框架是一种软件开发工具,用于简化 Web 应用程序(网站、API 等)的构建过程。它提供了一套预定义的结构、组件和工具,帮助开发者更高效地处理 HTTP 请求、路由、数据库交互、模板渲染等常见任务,而无需从零开始编写底层代码。
Web 框架通常包含以下核心功能:
| 功能 | 作用 | 示例(不同框架的实现) | 
|---|---|---|
| 路由(Routing) | 将不同的 URL 路径映射到对应的处理函数(如 "/users"→ 用户列表) | Crow: CROW_ROUTE(app, "/users") | 
| HTTP 请求处理 | 解析 HTTP 请求(GET/POST/PUT/DELETE),提取参数(查询字符串、表单、JSON) | Flask: request.args.get("name") | 
| 响应生成 | 构造 HTTP 响应(返回 HTML、JSON、文件等) | Express(Node.js): res.send("Hello") | 
| 模板引擎 | 动态生成 HTML(如将数据嵌入网页) | Django: render(request, "index.html", data) | 
| 数据库集成 | 提供 ORM(对象关系映射)或数据库连接工具 | Laravel(PHP): User::where("age", ">", 18)->get() | 
| 中间件(Middleware) | 在请求/响应流程中插入额外逻辑(如身份验证、日志记录) | Express: app.use(authMiddleware) | 
| 会话管理 | 管理用户登录状态(Cookies/Session) | Flask: session["user"] = "Alice" | 
3.Crow安装
1.克隆源码
git clone https://github.com/CrowCpp/Crow.git2.设置VSCode路径
"includePath": ["${workspaceFolder}/**","/**/proj/third_party/Crow/include","/usr/include/boost"],3.CMake配置
让 Crow 使用 Boost 版本的 Asio
option(CROW_USE_BOOST "Use boost::asio instead of standalone Asio" ON)
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})add_executable(upload_serverupload_server.cpp 
)target_compile_definitions(upload_server PRIVATE CROW_USE_BOOST)# 包含 storage 目录
target_include_directories(upload_serverPUBLIC ${CMAKE_SOURCE_DIR}/third_party/Crow/include${CMAKE_SOURCE_DIR}/include/storage)# 链接 storage 库 和 muduo
target_link_libraries(upload_serverPUBLICstorage
)
4.Crow使用
crow::SimpleApp app;
CROW_ROUTE(app, "/upload").methods("POST"_method)([](const crow::request& req) {// 这里是处理 POST 请求的逻辑
});-  CROW_ROUTE(app, "/upload"):定义了一个路由,路径为/upload。
-  .methods("POST"_method):指定这个路由只处理 HTTP POST 请求。
-  ([](const crow::request& req) { ... }):定义了一个 Lambda 表达式,当 POST 请求到达/upload路径时,这个 Lambda 表达式会被调用,req参数包含了请求的相关信息。
#include "crow_all.h"
#include "file_manager.h"
#include "mysql_client.h"
#include "redis_client.h"#include <nlohmann/json.hpp>
#include <iostream>using json = nlohmann::json;int main() {crow::SimpleApp app;CROW_ROUTE(app, "/upload").methods("POST"_method)([](const crow::request& req) {crow::response res;try {auto body = json::parse(req.body);std::string filename = body["filename"];std::string content = body["content"];// 保存文件std::string path = dfs::FileManager::saveFile(filename, content);size_t size = dfs::FileManager::getFileSize(path);// 存储元数据到 MySQLdfs::MySQLClient::FileMeta fileMeta{filename, path, size};dfs::MySQLClient mysql;mysql.insertMetaData(fileMeta);// 缓存元数据到 Redisdfs::RedisClient redis;redis.cacheMeta(filename, path);res.code = 200;res.set_header("Content-Type", "application/json");res.body = R"({"status":"success","msg":"File uploaded successfully"})";} catch (const std::exception& e) {res.code = 500;res.set_header("Content-Type", "application/json");res.body = R"({"status":"error","msg":")" + std::string(e.what()) + R"("})";}return res;});std::cout << "Upload server is running on http://0.0.0.0:18080/upload" << std::endl;app.port(18080).multithreaded().run();
}
-  app.port(18080):-  app是一个crow::SimpleApp对象,代表你的 Crow 应用。
-  port(18080)方法告诉应用监听 18080 端口上的 HTTP 请求。你可以根据需要更改这个端口号,只要它不与系统上其他服务使用的端口冲突。
 
-  
-  .multithreaded():-  这个方法使应用以多线程模式运行。在多线程模式下,Crow 将创建多个工作线程来处理并发请求。这可以提高应用处理大量并发请求的能力。 
-  如果你的应用不需要处理大量并发请求,或者你希望简化代码,你也可以省略 .multithreaded()方法,使应用以单线程模式运行。
 
-  
-  .run():-  这个方法启动 HTTP 服务器,使其开始监听指定端口上的请求,并处理这些请求。 
-  当调用 .run()方法时,Crow 将开始接受和处理 HTTP 请求,直到你停止服务器。
 
-  
curl -X POST http://localhost:18080/upload \-H "Content-Type: application/json" \-d '{"filename": "example.txt","content": "'"$(base64 -w 0 /home/book/Desktop/chat/local/example.txt)"'"}'