Negroni 应用教程系列(二)
在介绍 Negroni 经典实例三大组件:日志 Logger,异常 Recovery,静态文件 Static 之前,需要说说它们采用的底层内幕,那就是中间件。Negroni 负责把一个个中间件链接起来,按照顺序逐一执行,形成一个中间件链。
Negroni 中间件实质是一个接口,名为 Handler,我们看看它的定义:
type Handler interface { ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) }
我们看到接口里面定义了一个函数 ServeHTTP,和原生 http handle 极为相似,只是多了一个 http.HandlerFunc 参数 next。 所以第三方中间件和 Negroni 搭配使用的时候,只要实现了 Handler 接口就能成为 Negroni 公民了。日志 Logger,异常 Recovery,静态文件 Static 就是实现了 Handler,只是他们是 Negroni 的一等公民。
中间件在 Negroni 里面,算是核心部件了,我们现在定义一个自己的中间件 MyMiddleware,代码如下:
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { // do some stuff before next(rw, r) // do some stuff after }
代码只有几行,看注释,你会发现,中间件有一个前置片段和后置片段,线性顺序执行,也就是说,Negroni 引进我们自定义好的 MyMiddleware 的时候,会先执行 前置片段的代码,然后再执行 next ,也就是一个 http 响应函数,最后才执行后置片段代码。
通俗的说一个场景,有个页面,我们想这个页面返回数据之前,先做一些准备工作,就是验证用户是否登录了,如果登录了,就让这个页面返回数据,页面数据响应完毕后,我们还想做一些收尾工作,比如写入日志,说明页面已经成功响应了。这就是中间件的整个流程了。
我们说了中间件的底层内幕后,大概知道它是什么东西了,也知道它的流程了,那么 Negroni 怎么引进一个中间件呢?
n := negroni.New() n.UseFunc(MyMiddleware)或者:
n := negroni.New() n.Use(negroni.HandlerFunc(MyMiddleware))
我们首先实例化一个没有任务中间件的 Negroni 对象,然后通过 UseHandler 接收中间件。最后注意,Negroni 引进一个中间件是有顺序性的。
1 楼: 呼啦呼 发表于 2019-05-04 18:40:53 回复 TA