• Gin学习记录4——Controller和中间件


    一. Controller

    不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件

    1.1 单文件Controller

    几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用:

    package admin
    
    import (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    )
    
    func Index(ctx *gin.Context) {
    	ctx.String(http.StatusOK, "首页")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    调用:

    package main
    
    import (
    	"kanna-web/controller/admin"
    
    	"github.com/gin-gonic/gin"
    )
    
    func main() {
    	r := gin.Default()
    	r.GET("/", admin.Index)
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1.2 Controller类与继承

    这个和类的写法也是一样的:

    package admin
    
    import (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    )
    
    type UserController struct {
    }
    
    type AdminController struct {
    	UserController
    }
    
    func (c AdminController) Index(ctx *gin.Context) {
    	ctx.String(http.StatusOK, "首页")
    }
    
    func (c AdminController) Page(ctx *gin.Context) {
    	ctx.String(http.StatusOK, "Page")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    调用:

    package main
    
    import (
    	"kanna-web/controller/admin"
    
    	"github.com/gin-gonic/gin"
    )
    
    func main() {
    	r := gin.Default()
    	r.GET("/", admin.AdminController{}.Index)
    	r.GET("/page/", admin.AdminController{}.Page)
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二. 中间件

    中间件就是在RouterController之间可以执行的代码,可以给单个路由添加,也可以路由组添加,也可以全局添加。

    2.1 Default or New

    在我们创建路由的时候,是gin.Default(),即包含了:LoggerRecover这两个中间件。
    如果不需要使用者两个中间件可以gin.New()
    中间件可以拿来鉴权等各种功能。

    2.2 中间件的使用

    最基本的形式:

    func baseMid(ctx *gin.Context) {
    	fmt.Println("我进入了中间件")
    }
    
    func main() {
    	r := gin.Default()
    	r.GET("/", baseMid, admin.AdminController{}.Index)
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    路由组:

    func main() {
    	r := gin.Default()
    	v1 := r.Group("/v1", baseMid)
    	{
    		v1.GET("/login", func(ctx *gin.Context) {
    			ctx.String(http.StatusOK, "Success")
    		})
    	}
    	r.Run(":80")
    }
    // or v1.Use(baseMid)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    全局:

    func main() {
    	r := gin.Default()
    	r.Use(baseMid)
    	v1 := r.Group("/v1")
    	{
    		v1.GET("/login", func(ctx *gin.Context) {
    			ctx.String(http.StatusOK, "Success")
    		})
    	}
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3 Next()和Abort()

    Next()可以先执行Control的内容,再返回到Next()处:

    func baseMid(ctx *gin.Context) {
    	fmt.Println("我进入了")
    	ctx.Next()
    	fmt.Println("我离开了")
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(baseMid)
    	r.GET("/", func(ctx *gin.Context) {
    		fmt.Println("我显示了")
    		ctx.String(http.StatusOK, "Success")
    	})
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    Abort()可以结束Controller的行为:

    func baseMid(ctx *gin.Context) {
    	fmt.Println("我进入了")
    	ctx.Abort()
    	fmt.Println("我离开了")
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(baseMid)
    	r.GET("/", func(ctx *gin.Context) {
    		fmt.Println("我显示了")
    		ctx.String(http.StatusOK, "Success")
    	})
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    在这里插入图片描述

    2.4 多中间件顺序

    func Mid1(ctx *gin.Context) {
    	fmt.Println("中间件1进入")
    	ctx.Next()
    	fmt.Println("中间件1离开")
    }
    
    func Mid2(ctx *gin.Context) {
    	fmt.Println("中间件2进入")
    	ctx.Next()
    	fmt.Println("中间件2离开")
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(Mid1, Mid2)
    	r.GET("/", func(ctx *gin.Context) {
    		fmt.Println("我显示了")
    		ctx.String(http.StatusOK, "Success")
    	})
    	r.Run(":80")
    }
    /*
    中间件1进入
    中间件2进入
    我显示了
    中间件2离开
    中间件1离开
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    func Mid1(ctx *gin.Context) {
    	fmt.Println("中间件1进入")
    	ctx.Abort()
    	fmt.Println("中间件1离开")
    }
    
    func Mid2(ctx *gin.Context) {
    	fmt.Println("中间件2进入")
    	ctx.Next()
    	fmt.Println("中间件2离开")
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(Mid1, Mid2)
    	r.GET("/", func(ctx *gin.Context) {
    		fmt.Println("我显示了")
    		ctx.String(http.StatusOK, "Success")
    	})
    	r.Run(":80")
    }
    /*
    中间件1进入
    中间件1离开
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.5 中间件与Control共享数据

    可以用set*get*等函数,例如:

    func Mid1(ctx *gin.Context) {
    	ctx.Set("uid", "kanna")
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(Mid1)
    	r.GET("/", func(ctx *gin.Context) {
    		uid := ctx.GetString("uid")
    		ctx.String(http.StatusOK, uid)
    	})
    	r.Run(":80")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    数据存储选项
    自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)
    Linux:Command ‘vim‘ not found, but can be installed with:
    大厂搅局网约车,聚合平台别有用心?
    RSA加密解密算法复习
    【PCB学习】几种接地符号
    “智能合约审计:确保区块链应用安全的关键步骤“
    使用 Docker 安装 Kibana 8.4.3
    【JavaScript总结】双等与三等
    C++多线程入门
  • 原文地址:https://blog.csdn.net/u011017694/article/details/133026777