Skip to content

CHN 04 0 控制器 简介

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

English | 简体中文

控制器(controller)在web应用开发中处于相当重要的地位,它处理浏览器发来的请求,然后生成响应发送给浏览器;drogon框架已经帮我们处理好网络传输、Http协议的解析等等细节,我们只需要关注控制器的逻辑即可;每一个控制器对象可以有一个或者多个处理函数(一般称为handler),函数的接口,一般定义成如下形式:

void handlerName(const HttpRequestPtr &req,
                   std::function<void (const HttpResponsePtr &)> &&callback,
                  ...);

其中,req是Http请求的对象(被智能指针包裹),callback是框架传给控制器的回调函数对象,控制器生成应答对象(也通过智能指针包裹)后,通过callback把该对象传给drogon,然后框架会帮你把响应内容发送给浏览器,最后面的是若干参数列表...,由drogon根据映射规则把Http请求中的参数映射到对应的handler的形参上,这是对应用开发是非常方便的。

很明显,这是个异步接口,用户可以在其它线程完成耗时操作后再调用callback;

drogon的控制器分为三种类型,HttpSimpleController,HttpControllerWebSocketController,用户使用时,需要继承相应的类模板,比如,一个HttpSimpleController的自定义类"MyClass"声明如下:

class MyClass:public drogon::HttpSimpleController<MyClass>
{
public:
    //TestController(){}
    virtual void asyncHandleHttpRequest(const HttpRequestPtr &req,
                                         std::function<void (const HttpResponsePtr &)> &&callback) override;

    PATH_LIST_BEGIN
    PATH_ADD("/json");
    PATH_LIST_END
};

控制器的生命周期

注册到drogon框架的控制器最多只会有一个实例,在整个应用运行期间都不会销毁,所以,用户可以在控制器类中声明和使用成员变量。注意,控制器的handler被调用时,是在多线程环境下的(当框架的IO线程数配置成大于1的值时),如果需要访问非临时变量,请做好并发保护工作。

Document

Tutorial

中文文档

教程

Clone this wiki locally