Go Iris 中间件

Iris 中间件

当我们在 iris 中讨论中间件时,我们讨论的是在HTTP请求生命周期中在主处理程序代码之前和/或之后的运行代码。
实现中间件功能,有下面这样两种方式:

方式一:

我们可以通过按顺序注册多个 handler 的方式来实现中间件的效果:

package main

import "github.com/kataras/iris"

func main() {
 app := iris.New()
 app.Get("/", before, mainHandler, after)

 login := app.Party("/login", loginHandler)
 login.Get("/{name}", loginNameHandler)

 app.Run(iris.Addr(":9090"))
}

func loginNameHandler(ctx iris.Context){
 name := ctx.Params().Get("name")
 println(name)
 ctx.Next()
}

func loginHandler(ctx iris.Context){
 println("login")
 ctx.Next()
}

func before(ctx iris.Context){
 println("before")
 ctx.Next() //继续执行下一个handler,这本例中是mainHandler
}

func mainHandler(ctx iris.Context){
 println("mainHandler")
 ctx.Next()
}

func after(ctx iris.Context){
 println("after")
 ctx.Next()
}

访问 localhost:9090/输出结果:

before
mainHandler
after

访问 localhost:9090/login/zhangsan 输出结果:

login
zhangsan

方式二(全局中间件):

我们会注意到,访问 login 路径时的中间件代码并没有被执行。如果希望在全局范围内使用中间件,而不仅仅是针对某一个路径时,可以通过使用 UseDone 方法来为当前域名下的所有路由进行注册

func main() {
   app := iris.New()
   //注意 Use 和 Done 方法需要写在绑定访问路径的方法之前

   //使用 ‘Use’ 方法作为当前域名下所有路由的第一个处理函数
   //而使用 ‘UseGlobal’ 方法注册的中间件,会在包括所有子域名在内的所有路由中执行
   app.Use(UseBefore)
   app.Done(DoneAfter)

   app.Get("/", before, mainHandler, after)
   login := app.Party("/login", loginHandler)
   login.Get("/{name}", loginNameHandler)

   app.Run(iris.Addr(":9090"))
}

func UseBefore(ctx iris.Context){
  println("use - before")
   ctx.Next()
}

func DoneAfter(ctx iris.Context) {
  println("Done - after")
   ctx.Next()
}

访问 localhost:9090/ 输出结果:

use - before
before
mainHandler
after
Done - after

访问 localhost:9090/login/zhangsan 输出结果:

use - before
login
zhangsan
Done - after

可以看到通过 Use 和 Done 方法注册的中间件都被执行了。

posted @ 2019-01-15 11:25  Helldorado  阅读(3945)  评论(0编辑  收藏  举报