一,安装需要用到的库
1,gin框架在github的地址:
https://github.com/gin-gonic/gin
2,从命令行安装:
root@ku:/data/go/ginhello# go get -u github.com/gin-gonic/gin@v1.6.3
说明:刘宏缔的go森林是一个专注golang的博客,
网站:https://blog.imgtouch.com
原文: go语言web开发系列之二十六:gin框架:演示有多个middleware时代码的执行顺序 – 架构森林
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,项目地址:
https://github.com/liuhongdi/digv26
2,功能说明:演示使用多个middleware(中间件)时,middleware中代码的执行顺序
3,项目结构:如图:
三,go代码说明
1,middleware/middle.go
package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//第一个middleware
func MiddlewareOne() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("before middlewareOne: "+time.Now().String())
c.Next()
fmt.Println("after middlewareOne: "+time.Now().String())
return
}
}
//第二个middleware
func MiddlewareTwo() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("before middlewareTwo: "+time.Now().String())
c.Next()
fmt.Println("after middlewareTwo: "+time.Now().String())
return
}
}
//第三个middleware
func MiddlewareThree() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("before MiddlewareThree: "+time.Now().String())
c.Next()
fmt.Println("after MiddlewareThree: "+time.Now().String())
return
}
}
2,router/router.go
package router
import (
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv26/controller"
"github.com/liuhongdi/digv26/global"
"github.com/liuhongdi/digv26/middleware"
"log"
"runtime/debug"
)
func Router() *gin.Engine {
router := gin.Default()
//处理异常
router.NoRoute(HandleNotFound)
router.NoMethod(HandleNotFound)
//use middleware
router.Use(middleware.MiddlewareTwo())
router.Use(middleware.MiddlewareOne())
router.Use(middleware.MiddlewareThree())
router.Use(Recover)
// 路径映射:index
indexc:=controller.NewIndexController()
router.GET("/index/index", indexc.Index);
return router
}
func HandleNotFound(c *gin.Context) {
global.NewResult(c).Error(404,"资源未找到")
return
}
func Recover(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
//打印错误堆栈信息
log.Printf("panic: %v\n", r)
debug.PrintStack()
global.NewResult(c).Error(500,"服务器内部错误")
}
}()
//加载完 defer recover,继续后续接口调用
c.Next()
}
3,controller/indexController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv26/global"
"time"
)
type IndexController struct{}
func NewIndexController() IndexController {
return IndexController{}
}
//返回一个成功的提示
func (g *IndexController) Index(c *gin.Context) {
fmt.Println("controller:index: "+time.Now().String())
result := global.NewResult(c)
result.Success("success");
return
}
四,测试效果
访问:
http://127.0.0.1:8080/index/index
返回:
查看控制台的输出 :
before middlewareTwo: 2021-02-03 11:52:29.84260954 +0800 CST m=+3.560203369
before middlewareOne: 2021-02-03 11:52:29.842749172 +0800 CST m=+3.560342999
before MiddlewareThree: 2021-02-03 11:52:29.842758214 +0800 CST m=+3.560352049
controller:index: 2021-02-03 11:52:29.842761431 +0800 CST m=+3.560355255
after MiddlewareThree: 2021-02-03 11:52:29.842819585 +0800 CST m=+3.560413419
after middlewareOne: 2021-02-03 11:52:29.842825746 +0800 CST m=+3.560419571
after middlewareTwo: 2021-02-03 11:52:29.842828523 +0800 CST m=+3.560422350
可以看到:
有多个middleware时
对于next之前的代码,是按use的顺序生效,
而next之后的代码,则是按相反的顺序生效
五,查看库的版本:
module github.com/liuhongdi/digv26
go 1.15
require (
github.com/gin-gonic/gin v1.6.3
)