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 路徑時的中間件代碼並沒有被執行。如果希望在全局范圍內使用中間件,而不僅僅是針對某一個路徑時,可以通過使用 Use 和 Done 方法來為當前域名下的所有路由進行注冊
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 方法注冊的中間件都被執行了。
