Drogon是一个基于C++14/17的HTTP应用程序框架。Drogon可用于使用C++轻松构建各种类型的Web应用程序服务器程序。卓根是美国电视剧“权力的游戏”中一条龙的名字,我真的很喜欢。
Drogon是一个跨平台的框架,它支持Linux、MacOS、FreeBSD和Windows。它的主要特点如下:
使用基于EPOLL的非阻塞I/O网络库(MacOS/FreeBSD下的kqueue)提供高并发、高性能的网络IO,详见TFB测试结果;
在模板的基础上,实现了简单的反射机制,实现了主程序框架、控制器和视图的完全解耦。
支持后端渲染,控制器将数据生成到视图,生成HTML页面。视图由CSP模板文件描述,C++代码通过CSP标签嵌入到HTML页面中。Drogon命令行工具自动生成C++代码文件进行编译;
支持过滤链,便于执行统一逻辑(如登录验证、http方法约束验证等)。在处理HTTP请求之前;
提供轻量级命令行工具drogon_ctl,简化Drogon中各种类的创建和视图代码的生成;
与大多数C++框架不同,Drogon应用程序的主程序可以保持干净和简单。Drogon使用一些技巧将控制器与主程序分离。控制器的路由设置可以通过宏或配置文件完成。
Drogon提供了一些直接在main()函数中添加控制器逻辑的接口,例如,用户可以在Drogon中注册如下处理程序:
App().registerHandler(";/test?username={name}";,[](const HttpRequestPtr&;req,std::function<;void(const HttpResponsePtr&;)>;&;&;callback,const std::string&;name){json::value json;json[";result"。Hello,";)+name;auto resp=HttpResponse::newHttpJsonResponse(Json);callback(Resp);},{get,";LoginFilter";});
虽然这样的界面看起来很直观,但它们不适合复杂的业务逻辑场景。假设有数十个甚至数百个处理程序需要在框架中注册,那么在各自的类中分别实现它们不是更好的做法吗?因此,除非您的逻辑非常简单,否则我们不推荐使用上述接口。相反,我们可以创建一个HttpSimpleController,如下所示:
/使用命名空间Drogon;类TestCtrl:public Drogon::HttpSimpleController<;TestCtrl>;{public:virtual void asyncHandleHttpRequest(const HttpRequestPtr&;req,std;{public:virtual void asyncHandleHttpRequest(const HttpRequestPtr&;req,std。/TestCtrl.cc文件#include";TestCtrl.h&34;void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr&;req,std::function<;void(const HttpResponsePtr&;)>;&;&;callback){//在此处写入您的应用程序逻辑auto resp=。回调(分别);}。
上面的大多数程序都可以由Drogon提供的命令行工具drogon_ctl自动生成(命令是drogon_ctl create Controller TestCtrl)。所有用户需要做的就是添加他们自己的业务逻辑。在本例中,控制器返回Hello,world!客户端访问http://ip/test URL时的字符串。
/使用命名空间Drogon;class JsonCtrl:public Drogon::HttpSimpleController<;JsonCtrl>;{public:virtual void asyncHandleHttpRequest(const HttpRequestPtr&;req,std::function<。/源文件#include";JsonCtrl.h";void JsonCtrl::asyncHandleHttpRequest(const HttpRequestPtr&;req,std::function<;void(const HttpResponsePtr&;)>;&;&;callback){json::value ret;ret[";message";
让我们更进一步,使用HttpController类创建一个REST风格的演示API,如下所示(省略源文件):
/使用命名空间Drogon;命名空间API{命名空间v1{class user:public Drogon::HttpController<;user>;{public:method_list_Begin//使用method_add在这里添加您的自定义处理函数;method_add(user::getInfo,";/{id}";,get)]头文件#scrima once#include<;Drogon/HttpController.h>;使用Namespace Drogon;Namespace API{Namespace v1{class user:public Drogon::HttpController<;user>;{id}";,get)。//路径为/api/v1/user/{arg1}method_add(user::getDetailInfo,";/{id}/Detinfo";,get);//路径为/api/v1/user/{arg1}/Detinfo method_add(user::newUser,";/{name}";,Post);//路径为/api/v1/user/{arg1}method_list_end//您的处理函数声明可能如下所示:void getInfo(const HttpRequestPtr&;req,std::function<;void(const HttpResponsePtr&;)>;&;&;callback,int userID)const;void getDetailInfo(const HttpRequestP。请求,std::function<;void(const HttpResponsePtr&;)>;&;&;回调,std::string&;&;userName);public:user(){log_debug<;<;";User Constructor!";;}}//命名空间v1}//命名空间API
如您所见,用户可以使用HttpController同时映射路径和参数。这是创建RESTful API应用程序的一种非常方便的方式。
此外,您还可以发现所有处理程序接口都处于异步模式,其中响应由回调对象返回。这种设计是出于性能原因,因为在异步模式下,Drogon应用程序可以用少量线程处理大量并发请求。
编译完上述所有源文件后,我们将得到一个非常简单的Web应用程序。这是一个良好的开端。有关更多信息,请访问维基或DocsForge