在linux环境下创建C++ drogon 项目 进行接口测试(项目推动型学习)
-
项目简单(仅为学习)
我并不是很会这个框架 还在学习中
环境准备(Ubuntu 22.04)gcc --version检查当前GCC版本:
gcc --version

图1-1(C++版本查询)
g++ -v --help 2>&1 | grep "std="若版本低于9.0,需执行以下升级操作:
sudo apt update && sudo apt upgrade -y sudo apt install build-essential git cmake -y sudo apt install gcc-10 g++-10 -y验证C++17支持:
g++ -v --help 2>&1 | grep "std="输出应包含gnu++17或c++17 例如:


MySQL依赖安装()
安装MariaDB开发库drogon:
sudo apt install -y libmariadb-dev创建源码目录并克隆仓库:
mkdir drogon_src && cd drogon_src git clone https://github.com/drogonframework/drogon编译安装:
cd drogon mkdir build && cd build cmake ..初次编译可能会遇到缺失trantor 子模块(Drogon 的网络库依赖)没有被正确下载或初始化。

笔者解决办法为:
# 进入 Drogon 源码根目录 cd ~/drogon/drogon# 初始化并更新所有子模块 git submodule update --init --recursive编译
编译安装 (nproc)调用当前可用核心数用于编译
make -j$(nproc)等待编译:

环境验证
验证drogon 是否安装成功 出现以下版本信息即可。

*** 使用drogon_ctl创建项目。**
在自己喜欢的文件夹中创建项目
drogon_ctl create project Hello-drogon cd Hello-drogon进入Hello-drogon的controllers 中在终端新建一个控制器。
#drogon_ctl create controller [参数] [控制器名(自定义)] drogon_ctl create controller -h drogonpic
编写测试接口

编写一个简单的接口,该接口包含两个方法 路径为“api/pic”,“api/hello”,仅仅返回"hello drogon"的字符
drogonpic.h 代码:// drogonpic.h 头文件编写。
#pragma once #include <drogon/HttpController.h> using namespace drogon; class drogonpic : public drogon::HttpController<drogonpic> { public: METHOD_LIST_BEGIN // 确保类名正确 ADD_METHOD_TO(drogonpic::getPic, "/api/pic", Get); ADD_METHOD_TO(drogonpic::hello, "/api/hello", Get); METHOD_LIST_END //hello world void hello(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback) const; // 图片获取方法 void getPic(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback) const; };#include "drogonpic.h" #include <drogon/HttpResponse.h> #include <drogon/drogon.h> // 添加日志支持 #include <sys/stat.h> using namespace drogon; void drogonpic::getPic(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback) const { // 使用绝对路径更可靠 const std::string imagePath = "/home/xhm/xhm/Drogon-Project/Hello-drogon/assets/pic2.png"; // 记录路径信息(调试用) LOG_INFO << "Attempting to load image: " << imagePath; // 检查文件是否存在 struct stat buffer; if (stat(imagePath.c_str(), &buffer) != 0) { LOG_ERROR << "Image not found: " << imagePath; auto resp = HttpResponse::newHttpResponse(); resp->setStatusCode(k404NotFound); resp->setBody("Image not found"); callback(resp); return; } // 创建文件响应 auto resp = HttpResponse::newFileResponse(imagePath, "", CT_IMAGE_PNG); if (!resp) { LOG_ERROR << "Failed to open image: " << imagePath; resp = HttpResponse::newHttpResponse(); resp->setStatusCode(k500InternalServerError); resp->setBody("Failed to open image"); } else { LOG_INFO << "Image loaded successfully: " << imagePath; } callback(resp); } // 处理GET请求的方法 void drogonpic::hello(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback) const { // 创建HTTP响应对象 auto resp = HttpResponse::newHttpResponse(); // 设置响应内容 resp->setBody("hello world"); // 设置响应状态码(可选,默认200) // resp->setStatusCode(k200OK); // 通过回调返回响应 callback(resp); }对接口进行测试
对api/hello 测试 使用apipost 进行测试 测试结果如下图所示:ip地址为linux主机的ip网页访问:


压测结果:
对api/pic 测试 给接口是返回一张图片

网页访问:

压测结果:
总结: C++特性 代码示例 #pragma once#pragma onceCRTP模板继承 class X : public drogon::HttpController<X>auto自动推导auto resp = HttpResponse::newHttpResponse();右值引用 &&std::function<void(const T&)>&& callbackstd::functionstd::function<void(const HttpResponsePtr&)>智能指针 HttpRequestPtr,HttpResponsePtrconst成员函数void getPic(...) constC++调用C接口 stat(path.c_str(), &buffer)