4 CHN 03 快速开始
Robert Huang edited this page 2023-02-12 11:25:32 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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目录。

04.0 控制器简介