古老的榕树

Negroni 应用教程系列(二)

潘军杰 发表于 2018-01-10 23:52 阅读(3309) 评论(1) 赞(2)

在介绍 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 引进一个中间件是有顺序性的。

标签: Go Negroni 中间件
1 条网友评论

1 楼: 呼啦呼 发表于 2019-05-04 18:40:53   回复 TA

Good Job.
称呼*
邮箱*
内容*
验证码*
验证码 看不清换张