栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Gin之中间件

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gin之中间件

文章目录
  • Gin之中间件
    • 1.中间件介绍
    • 2.为路由单独注册中间件
    • 3.中间件后续执行
    • 4.为全局路由注册1个中间件
    • 5.为全局路由注册2个中间件
    • 6.为路由组注册中间件
    • 7.中间件后面路由停止执行
    • 8.中间件后面路由停止执行(结合return)
    • 9.数据传递

Gin之中间件

注:本文基于Windos系统上Go SDK v1.17.5、github.com/gin-gonic/gin v1.7.7依赖进行讲解

1.中间件介绍

Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等
即比如,如果访问一个网页的话,不管访问什么路径都需要进行登录,此时就需要为所有路径的处理函数进行统一一个中间件
Gin中的中间件必须是一个gin.HandlerFunc类型

2.为路由单独注册中间件
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)
func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}

//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
}
func main() {
	r := gin.Default()
	//m1处于indexHandler函数的前面,请求来之后,先走m1,再走index
	r.GET("/index", m1, indexHandler)

	_ = r.Run()
}


3.中间件后续执行
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}
//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now() 
	c.Next() //调用后续的处理函数,即indexHandler
	//Since是一个函数,传入的参数是(t Time),返回值是 Duration
	//Duration是一个自定义类型,即: type Duration int64
	cost := time.Since(start) //从开始时间到现在花费的时间
	fmt.Println(cost)
	
	fmt.Println("m1 out.........")
}
func main() {
	r := gin.Default()
	//m1处于indexHandler函数的前面,请求来之后,先走m1,再走index
	r.GET("/index", m1, indexHandler)

	_ = r.Run()
}

注:indexHandler不会被执行第二次

4.为全局路由注册1个中间件
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)
func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}
//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now()
	c.Next()
	cost := time.Since(start)
	fmt.Println(cost)
	fmt.Println("m1 out.........")
}
func main() {
	r := gin.Default()
	//Use是*Engine的方法, 参数是(middleware ...HandlerFunc) ,返回值是IRoutes
	r.Use(m1)
	r.GET("/index", indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})
	r.GET("/user", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})
	_ = r.Run()
}

5.为全局路由注册2个中间件

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)
func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}
//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now()
	c.Next()
	cost := time.Since(start)
	fmt.Println(cost)
	fmt.Println("m1 out.........")
}
//定义一个中间件
func m2(c *gin.Context) {
	fmt.Println("m2 in.........")
	c.Next()
	fmt.Println("m2 out.........")
}
func main() {
	r := gin.Default()
	r.Use(m1, m2)
	r.GET("/index", indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})
	r.GET("/user", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})
	_ = r.Run()
}

6.为路由组注册中间件

7.中间件后面路由停止执行
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}

//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now()
	c.Next()
	cost := time.Since(start)
	fmt.Println(cost)
	fmt.Println("m1 out.........")
}

//定义一个中间件
func m2(c *gin.Context) {
	fmt.Println("m2 in.........")
	c.Abort()//阻止调用后续的处理函数
	fmt.Println("m2 out.........")
}
func main() {
	r := gin.Default()
	r.Use(m1, m2)
	r.GET("/index", indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		fmt.Println("1111")
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})
	r.GET("/user", func(c *gin.Context) {
		fmt.Println("222222222")
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})
	_ = r.Run()
}

注:不会返回json数据




8.中间件后面路由停止执行(结合return)
package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)
func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	c.JSON(http.StatusOK, gin.H{
		"msg": "index",
	})
}
//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now()
	c.Next()
	cost := time.Since(start)
	fmt.Println(cost)
	fmt.Println("m1 out.........")
}
//定义一个中间件
func m2(c *gin.Context) {
	fmt.Println("m2 in.........")
	c.Abort()
	return
	fmt.Println("m2 out.........")
}
func main() {
	r := gin.Default()
	r.Use(m1, m2)
	r.GET("/index", indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		fmt.Println("1111")
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})
	r.GET("/user", func(c *gin.Context) {
		fmt.Println("222222222")
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})
	_ = r.Run()
}

9.数据传递

在中间件里做一些操作,然后在处理函数里拿到或者其它的中间件里拿到

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func indexHandler(c *gin.Context) {
	fmt.Println("index.....")
	//Get是*Context的方法 传入的参数是(key string) ,返回值是(value interface{}, exists bool)
	name, ok := c.Get("name")
	if !ok {
		name = "匿名用户"
	}
	c.JSON(http.StatusOK, gin.H{
		"msg": name,
	})
}

//定义一个中间件
func m1(c *gin.Context) {
	fmt.Println("m1 in.........")
	start := time.Now()
	c.Next()
	cost := time.Since(start)
	fmt.Println(cost)
	name, ok := c.Get("name")
	if !ok {
		name = "匿名用户"
	}
	fmt.Println(name)
	fmt.Println("m1 out.........")
}

//定义一个中间件
func m2(c *gin.Context) {
	fmt.Println("m2 in.........")
	c.Set("name", "qimi")
	fmt.Println("m2 out.........")
}
func main() {
	r := gin.Default()
	r.Use(m1, m2)
	r.GET("/index", indexHandler)
	_ = r.Run()
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944179.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号