Skip to content

CHN 03 快速开始

Robert Huang edited this page Feb 12, 2023 · 4 revisions

English | 简体中文

静态网站

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

drogon_ctl create project your_project_name

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

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

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

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

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

然后构建项目:

cd build
cmake ..
make

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

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

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以上以解决遇到以下错误讯息):

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)源文件:

drogon_ctl create controller TestCtrl

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

TestCtrl.h如下:

#pragma once
#include <drogon/HttpSimpleController.h>
using namespace drogon;
class TestCtrl:public drogon::HttpSimpleController<TestCtrl>
{
public:
    virtual void asyncHandleHttpRequest(const HttpRequestPtr &req,
                                        std::function<void (const HttpResponsePtr &)> &&callback)override;
    PATH_LIST_BEGIN
    //list path definitions here;
    //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
    PATH_LIST_END
};

TestCtrl.cc如下:

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

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

TestCtrl.h如下:

#pragma once
#include <drogon/HttpSimpleController.h>
using namespace drogon;
class TestCtrl:public drogon::HttpSimpleController<TestCtrl>
{
public:
    virtual void asyncHandleHttpRequest(const HttpRequestPtr &req,
                                        std::function<void (const HttpResponsePtr &)> &&callback)override;
    PATH_LIST_BEGIN
    //list path definitions here;
    //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
    PATH_ADD("/",Get,Post);
    PATH_ADD("/test",Get);
    PATH_LIST_END
};

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

TestCtrl.cc如下:

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

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

cd ../build
cmake ..
make
./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目录。

Document

Tutorial

中文文档

教程

Clone this wiki locally