主要为了探究以下几个问题
目录
1.Drogon的安装配置
经历了多次失败,目前发现的比较可行的安装方法如下(官方的vcpkg安装),失败的方法:drogon的直接zip下载、conan下载:
1.下载cmake,在电脑上安装cmake,然后添加到设置-系统环境变量-系统变量的path中
2.安装vcpkg,网络不好就直接去github上下载zip,然后解压并切换到路径去执行第三条指令
git clone https://github.com/microsoft/vcpkg
cd vcpkg
./bootstrap-vcpkg.bat
3.在vcpkg中安装drogon(注意,使用64位的cmd)
vcpkg install drogon:x64-windows
有可能报错powershell,解决方案是去github下载powershell7(x64),然后用这个x64的powershell去执行第三步
4.检查C:\Users\xxx\vcpkg-master\installed\x64-windows\tools,如果没有drogon(我就是),那么要
vcpkg install drogon[ctl]:x64-windows
5.设置-系统环境变量-系统变量的path中添加如下路径
C:\Dev\vcpkg\installed\x64-windows\tools\drogon
C:\Dev\vcpkg\installed\x64-windows\bin
C:\Dev\vcpkg\installed\x64-windows\lib
C:\Dev\vcpkg\installed\x64-windows\include
6.重启powershell,输入drogon_ctl。出现下面这样就说明安装好了
usage: drogon_ctl [-v | --version] [-h | --help] <command> [<args>]
commands list:
create create some source files(Use 'drogon_ctl help create' for more information)
help display this message
press Do stress testing(Use 'drogon_ctl help press' for more information)
version display version of this tool
7.切换到你想要的路径下面,参照官方文档使用drogon_ctl创建一个工程。
drogon_ctl create project your_project_name
然后,使用cmake编译
cd build
cmake ..
最后,打开build中的sln工程
8.把drogon_project设为启动项,右键drogon_project-属性-C/C++ -代码生成-运行库。切换成多线程DLL/md。这样工程就创建好了。
2.Drogon的使用
1.创建http控制器
Drogon有HttpSimpleController、HttpController、WebSocketController。最常用的是HttpController,下面尝试进行分析。首先运行下面的代码
drogon_ctl create controller TestController
创建完了之后可以发现controllers文件夹中有TestController.h和TestController.cc。
然后对将两个文件分别进行修改。
.h的代码如下
#ifndef BIANYUANCONTROLLER_H
#define BIANYUANCONTROLLER_H
#include <drogon/HttpController.h>
using namespace drogon;
class BianyuanController : public drogon::HttpController<BianyuanController>
{
public:
METHOD_LIST_BEGIN
// 绑定路由到处理函数
ADD_METHOD_TO(BianyuanController::handleRequest, "/bianyuan", Get);
METHOD_LIST_END
// 处理请求的函数声明
void handleRequest(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback);
private:
// 自定义函数声明
std::string customFunction();
};
#endif // BIANYUANCONTROLLER_H
.cc的代码如下
#include "conf1.h"
void BianyuanController::handleRequest(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback)
{
// 调用自定义函数
std::string result = customFunction();
// 创建HTTP响应并发送回客户端
auto resp = HttpResponse::newHttpResponse();
resp->setContentTypeCode(drogon::CT_TEXT_PLAIN);
resp->setBody(result);
callback(resp);
}
std::string BianyuanController::customFunction()
{
// 你的自定义函数逻辑
return "Hello from /bianyuan!";
}
ADD_METHOD_TO(BianyuanController::handleRequest, "/bianyuan", Get);
这句话是绑定的核心。首先创建了一个BianyuanController类,然后将处理函数handleRequest和“/bianyuan”路由进行了绑定!在处理函数中,定义了一个结果result,并将这个结果进行callback。这个结果是由自定义函数(边缘检测)得到的。
这样就实现了了:访问“localhost/bianyuan”,然后调用自定义函数再回传。
2.观察http控制器
观察控制器的绑定,得到两个想法:
(1)控制器的绑定是在一个自定义类下完成的,这样就可以实现面向对象设计,如果这个类负责边缘检测,那么所有边缘检测的相关路径和相关函数都在这个类下进行绑定,就完成了和主函数的解耦!
(2)路径的唯一性。由于路径是分别在不同的类下面进行绑定,如果路径相同会怎么样?比如类A绑定了(/test),类B也绑定了(/test)。下面进行测试
理论上应该得到报错的结果,但是我得到的结果是
如果我注释掉A中的绑定,就变为了
说明Drogon面对路径冲突时,不一定会报错,有可能产生一个覆盖的结果,即对不同类中的同一个路径,只会选择一个方法进行绑定!所以我们在使用的时候要注意路径的唯一性,不然可能会出现绑定被覆盖的情况!
3.创建websocket控制器
【TODO】