ghttp.Server
提供了事件回调注册功能,类似于其他框架的 中间件
功能,相比较于 中间件
,事件回调的特性更加简单。
ghttp.Server
支持用户对于某一事件进行自定义监听处理,按照 pattern
方式进行绑定注册( pattern
格式与路由注册一致)。 支持多个方法对同一事件进行监听, ghttp.Server
将会按照 路由优先级
及 回调注册顺序
进行回调方法调用。同一事件时先注册的HOOK回调函数优先级越高。 相关方法如下:
func (s *Server) BindHookHandler(pattern string, hook string, handler HandlerFunc) error
func (s *Server) BindHookHandlerByMap(pattern string, hookmap map[string]HandlerFunc) error
当然域名对象也支持事件回调注册:
func (d *Domain) BindHookHandler(pattern string, hook string, handler HandlerFunc) error
func (d *Domain) BindHookHandlerByMap(pattern string, hookmap map[string]HandlerFunc) error
支持的 Hook
事件列表:
ghttp.HookBeforeServe
在进入/初始化服务对象之前,该事件是最常用的事件,特别是针对于权限控制、跨域请求等处理。
ghttp.HookAfterServe
在完 成服务执行流程之后。
ghttp.HookBeforeOutput
向客户端输出返回内容之前。
ghttp.HookAfterOutput
向客户端输出返回内容之后。
具体调用时机请参考图例所示。
回调优先级
由于事件的绑定也是使用的路由规则,因此它的优先级和 路由管理-路由规则 章节介绍的优先级是一样的。
但是事件调用时和路由注册调用时的机制不一样, 同一个路由规则下允许绑定多个事件回调方法,该路由下的事件调用会 按照优先级进行调用
,假如优先级相等的路由规则,将会按照事件注册的顺序进行调用。
关于全局回调
我们往往使用绑定 /*
这样的 HOOK
路由来实现全局的回调处理,这样是可以的。但是 HOOK
执行的优先是最低的,路由注册的越精确,优先级越高,越模糊的路由优先级越低, /*
就属于最模糊的路由。
为降低不同的模块耦合性,所有的路由往往不是在同一个地方进行注册。例如用户模块注册的 HOOK
( /user/*
),它将会被优先调用随后才可能是全局的 HOOK
;如果仅仅依靠注册顺序来控制优先级,在模块多路由多的时候优先级便很难管理。