0 CHN 04 1 控制器 HttpSimpleController
Nitromelon edited this page 2024-05-13 15:09:34 +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_ctl命令行工具快速生成基于HttpSimpleController的自定义类的源文件,命令格式如下:

drogon_ctl create controller <[namespace::]class_name>

我们创建一个名称为TestCtrl的控制器:

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
}

每个HttpSimpleController类只能定义一个Http请求处理函数(handler),而且通过虚函数重载定义。

从URL路径到处理函数的路由(或称映射)由宏完成,可以用PATH_ADD宏添加多重路径映射,所有PATH_ADD语句应夹在PATH_LIST_BEGINPATH_LIST_END宏语句之间。

第一个参数是映射的路径,路径后面的参数是对这个路径的约束,目前支持两种约束,一种是HttpMethod类型表示该路径允许使用的Http方法可以配置零个或多个一种是HttpFilter类的名字这种对象执行特定的过滤操作也可以配置0个或多个两种类型没有顺序要求框架会处理好类型的匹配。关于Filter请参阅中间件和过滤器

用户可以把同一个Simple Controller注册到多个路径上也可以在同一个路径上注册多个Simple Controller通过 HTTP method 区分)。

你可以定义一个HttpResponse类的变量然后使用callback()返回这个变量即可:

    //write your application logic here
    auto resp=HttpResponse::newHttpResponse();
    resp->setStatusCode(k200OK);
    resp->setContentTypeCode(CT_TEXT_HTML);
    resp->setBody("Your Page Contents");
    callback(resp);

上述路径到处理函数的映射是在编译期完成的事实上drogon框架也提供了运行期完成映射的接口运行期映射可以让用户通过配置文件或其它用户接口完成映射或修改映射关系而无需重新编译这个程序(出于性能的考虑禁止在运行app().run()之后再注册任何映射)。

04.2 HttpController