静态网站

我们从一个最简单的例子开始,介绍drogon的使用,在这个例子中我们使用命令行工具drogon_ctl创建一个工程:

  1. drogon_ctl create project your_project_name

进入工程目录,可以看到如下文件:

  1. ├── build 构建文件夹
  2. ├── CMakeLists.txt 工程的cmake配置文件
  3. ├── config.json drogon应用的配置文件
  4. ├── controllers 存放控制器文件的目录
  5. ├── filters 存放过滤器文件的目录
  6. ├── main.cc 主程序
  7. ├── models 数据库模型文件的目录
  8. └── model.json
  9. └── views 存放视图csp文件的目录

文件夹的名字就反应了它的用途,用户可以把各类文件(如控制器、过滤器、视图等等)分别放入对应的文件夹,方便项目管理,请读者自行实验。关于drogon_ctl的详细使用,可参见drogon_ctl

让我们看一下main.cc文件,内容如下:

  1. #include <drogon/HttpAppFramework.h>
  2. int main() {
  3. //Set HTTP listener address and port
  4. drogon::app().addListener("0.0.0.0",80);
  5. //Load config file
  6. //drogon::app().loadConfigFile("../config.json");
  7. //Run HTTP framework,the method will block in the internal event loop
  8. drogon::app().run();
  9. return 0;
  10. }

然后构建项目:

  1. cd build
  2. cmake ..
  3. make

编译完成后,运行目标程序./your_project_name.

现在,我们在Http根目录添加一个最简单的静态文件index.html:

  1. echo '<h1>Hello Drogon!</h1>' >>index.html

Http根目录默认值是"./", 也就是webapp程序运行的当前路径, Http根目录也可在config.json配置文件中进行更改,可参见配置文件, 然后在地址栏输入http://localhosthttp://localhost/index.html(或者你的webapp所在服务器的ip)可以访问到这个页面: Hello Drogon!

如果服务器找不到浏览器访问的页面,将返回404页面:

404页面

注意:请确认服务器的防火墙已经打开80端口,否则你看不到这些页面(或是将port改成1024以上以解决遇到以下错误讯息):

  1. FATAL Permission denied (errno=13) , Bind address failed at 0.0.0.0:80 - Socket.cc:67

我们可以把一个静态网站的目录和文件复制到这个webapp的运行目录,然后通过浏览器就可以访问到它们,drogon默认支持的文件类型有”html”,”js”,”css”,”xml”,”xsl”,”txt”,”svg”,”ttf”,”otf”,”woff2”,”woff”,”eot”,”png”,”jpg”,”jpeg”,”gif”,”bmp”,”ico”,”icns”等等,drogon也提供接口更改这些文件类型,具体请参考HttpAppFramework的API

动态网站

下面我们看看怎么给这个应用添加控制器(controller),并使用控制器(controller)输出内容。

controller目录下运行drogon_ctl命令行工具生成控制器(controller)源文件:

  1. drogon_ctl create controller TestCtrl

可以看到,目录下新增加了两个文件,TestCtrl.h和TestCtrl.cc:

TestCtrl.h如下:

  1. #pragma once
  2. #include <drogon/HttpSimpleController.h>
  3. using namespace drogon;
  4. class TestCtrl:public drogon::HttpSimpleController<TestCtrl>
  5. {
  6. public:
  7. virtual void asyncHandleHttpRequest(const HttpRequestPtr &req,
  8. std::function<void (const HttpResponsePtr &)> &&callback)override;
  9. PATH_LIST_BEGIN
  10. //list path definitions here;
  11. //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
  12. PATH_LIST_END
  13. };

TestCtrl.cc如下:

  1. #include "TestCtrl.h"
  2. void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req,
  3. std::function<void (const HttpResponsePtr &)> &&callback)
  4. {
  5. //write your application logic here
  6. }

我们编辑一下这两个文件,让这个控制器处理函数回应一个简单的“Hello World!”。

TestCtrl.h如下:

  1. #pragma once
  2. #include <drogon/HttpSimpleController.h>
  3. using namespace drogon;
  4. class TestCtrl:public drogon::HttpSimpleController<TestCtrl>
  5. {
  6. public:
  7. virtual void asyncHandleHttpRequest(const HttpRequestPtr &req,
  8. std::function<void (const HttpResponsePtr &)> &&callback)override;
  9. PATH_LIST_BEGIN
  10. //list path definitions here;
  11. //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
  12. PATH_ADD("/",Get,Post);
  13. PATH_ADD("/test",Get);
  14. PATH_LIST_END
  15. };

使用PATH_ADD添加路径到处理函数的映射,这里映射了两个路径’/‘和’/test’,并在路径后面添加了对这个路径的约束。

TestCtrl.cc如下:

  1. #include "TestCtrl.h"
  2. void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req,
  3. std::function<void (const HttpResponsePtr &)> &&callback)
  4. {
  5. //write your application logic here
  6. auto resp=HttpResponse::newHttpResponse();
  7. resp->setStatusCode(k200OK);
  8. resp->setContentTypeCode(CT_TEXT_HTML);
  9. resp->setBody("Hello World!");
  10. callback(resp);
  11. }

重新用cmake编译这个工程,然后运行目标程序./your_project_name

  1. cd ../build
  2. cmake ..
  3. make
  4. ./your_project_name

在浏览器地址栏输入http://localhost/或者http://localhost/test,你就可以在浏览器看到Hello World!了。

注意: 同时存在静态和动态资源的情况下,框架优先使用控制器响应请求,此例中http://localhost/ 响应的是TestCtrl控制器的输出Hello Word!而不是静态网页index.htmlHello Drogon!

我们看到,在应用中添加controller非常简单,只需要添加对应的源文件即可,甚至main文件不用做任何修改,这种低耦合度的设计对web应用开发是非常有效的。

注意: Drogon没有限制控制器(controller)源文件的位置,也可以放在工程目录下,甚至可以在CMakeLists.txt中指定到新的目录中,为了方便管理,建议将控制器源文件放在controllers目录。

04.0 控制器简介