当前位置: 首页 > news >正文

Crow介绍及使用

1.Crow是什么

Crow 是一个轻量级、高性能的 C++ Web 框架,专为快速构建 RESTful API 和 Web 应用而设计。它采用现代 C++(C++11 及以上)编写,以简洁的语法和易用性著称,适合需要高效网络服务的 C++ 开发者。


Crow 的核心特点

  1. 简洁的 API 设计

    • 类似 Python Flask 的路由语法,直观易用。

    • 示例:定义一个简单的路由只需几行代码:1.

      #include <crow.h>
      int main() {
          crow::SimpleApp app;
          CROW_ROUTE(app, "/")([](){ return "Hello, Crow!"; });
          app.port(8080).run();
      }

  2. 无第三方依赖

    • 仅需 C++ 标准库,无需额外安装依赖(但需支持 C++11 的编译器,如 GCC/Clang/MSVC)。

  3. 高性能

    • 基于异步 I/O(依赖平台的原生实现,如 Linux 的 epoll),适合高并发场景。

  4. 内置功能

    • 支持 HTTP/1.1、路由、中间件、JSON 请求/响应、WebSocket 等常见功能。

  5. 易集成

    • 可轻松嵌入现有 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.git

 2.设置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_server
    upload_server.cpp 
)

target_compile_definitions(upload_server PRIVATE CROW_USE_BOOST)

# 包含 storage 目录
target_include_directories(upload_server
    PUBLIC 
    ${CMAKE_SOURCE_DIR}/third_party/Crow/include
    ${CMAKE_SOURCE_DIR}/include/storage
    )

# 链接 storage 库 和 muduo
target_link_libraries(upload_server
    PUBLIC
    storage
)

 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);

            // 存储元数据到 MySQL
            dfs::MySQLClient::FileMeta fileMeta{filename, path, size};
            dfs::MySQLClient mysql;
            mysql.insertMetaData(fileMeta);

            // 缓存元数据到 Redis
            dfs::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();
}

  1. app.port(18080)

    • app 是一个 crow::SimpleApp 对象,代表你的 Crow 应用。

    • port(18080) 方法告诉应用监听 18080 端口上的 HTTP 请求。你可以根据需要更改这个端口号,只要它不与系统上其他服务使用的端口冲突。

  2. .multithreaded()

    • 这个方法使应用以多线程模式运行。在多线程模式下,Crow 将创建多个工作线程来处理并发请求。这可以提高应用处理大量并发请求的能力。

    • 如果你的应用不需要处理大量并发请求,或者你希望简化代码,你也可以省略 .multithreaded() 方法,使应用以单线程模式运行。

  3. .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)"'"
  }'

相关文章:

  • 一文了解亿级数据检索:RedisSearch
  • OpenBMC:BmcWeb 处理http请求5 检查权限
  • C#核心学习(十二)面向对象--多态(1)virtual override和base三剑客
  • CExercise_07_1指针和数组_5检查一个整数数组是否是回文,即正序与倒序相同
  • 【C#知识点详解】LinkedList<T>储存结构详解
  • Spring Boot接口返回Long类型的数据时丢失精度的全局处理
  • LCR 131. 砍竹子 I
  • 什么是混合搜索Hybrid Search?
  • Python 小练习系列 | Vol.14:掌握偏函数 partial,用函数更丝滑!
  • 和DeepSeek聊高速公路定向广播
  • NO.79十六届蓝桥杯备战|数据结构-扩展域并查集-带权并查集|团伙|食物链|银河英雄传说(C++)
  • CesiumEarth v1.12 更新,支持安卓平板离线浏览3DTiles格式的三维倾斜模型
  • 【计网】作业4
  • 树和图论(详细整理,简单易懂!)
  • AutoGLM沉思使用方式
  • 【已完结STM32】--自学江协科技笔记汇总
  • WHAT - React 元素接收的 ref 详解
  • 最新Spring Security实战教程(九)前后端分离认证实战 - JWT+SpringSecurity无缝整合
  • 进程间通信-共享内存
  • 辛格迪客户案例 | 河南宏途食品实施电子合约系统(eSign)
  • 这个接班巴菲特的男人,说不出一个打动人心的故事
  • 预告:央行等部门将发声,介绍“一揽子金融政策支持稳市场稳预期”有关情况
  • 中标多家学校采购项目的App查成绩需付费?涉事公司回应
  • 山大齐鲁医院护士论文现“男性确诊子宫肌瘤”,院方称将核实
  • 韩国总统选举民调:共同民主党前党首李在明支持率超46%
  • 新剧|《执法者们》《亲爱的仇敌》5月7日开播