3 CHN 04 0 控制器 简介
ProTankerAlfa edited this page 2024-05-20 01:29:57 -03: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 | 简体中文

控制器(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的值时如果需要访问非临时变量请做好并发保护工作。

04.1 HttpSimpleController