简介
控制器(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
,HttpController
和WebSocketController
,用户使用时,需要继承相应的类模板,比如,一个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的值时),如果需要访问非临时变量,请做好并发保护工作。