go gin中间件关于 c.next()、c.abort()和return的使用

c.netx()

  • 测试代码
go 复制代码
package main

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

func main() {
	g := gin.New()
	g.Use(middleware1(), middleware2())
	g.GET("/", func(c *gin.Context) {
		fmt.Println("process request")
		c.JSON(http.StatusOK, "hello,world!")
	})
	err := g.Run()
	if err != nil {
		log.Fatal(err)
	}
}
func middleware1() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware1 start")
		c.Next()
		fmt.Println("middleware1 end")
	}
}

func middleware2() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware2 start")
		c.Next()
		fmt.Println("middleware2 end")
	}
}
bash 复制代码
middleware1 start
middleware2 start
process request
middleware2 end
middleware1 end
  • 总结
    中间件的执行顺序是按照注册的顺序执行的,在中间件中使用 c.Next() 方法,会先执行c.Next() 前面的,然后将控制权传递给下一个中间件或处理器,最后按照相反顺序执行中间件c.Next() 后面的代码。

c.abort()

  • 测试代码
bash 复制代码
package main

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

func main() {
	g := gin.New()
	g.Use(middleware1(), middleware2(), middleware3())
	g.GET("/", func(c *gin.Context) {
		fmt.Println("process request")
		c.JSON(http.StatusOK, "hello,world!")
	})
	err := g.Run()
	if err != nil {
		log.Fatal(err)
	}
}
func middleware1() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware1 start")
		c.Next()
		fmt.Println("middleware1 end")
	}
}

func middleware2() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware2 start")
		c.Abort()
		fmt.Println("middleware2 end")
	}
}

func middleware3() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware3 start")
		c.Next()
		fmt.Println("middleware3 end")
	}
}
bash 复制代码
middleware1 start
middleware2 start
middleware2 end
middleware1 end
  • 总结
    中间件的执行顺序是按照注册顺序执行的,中间件可以通过 c.Abort() 来中止后续中间件或处理器的处理流程。

return

  • 测试代码
bash 复制代码
package main

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

func main() {
	g := gin.New()
	g.Use(middleware1(), middleware2(), middleware3())
	g.GET("/", func(c *gin.Context) {
		fmt.Println("process request")
		c.JSON(http.StatusOK, "hello,world!")
	})
	err := g.Run()
	if err != nil {
		log.Fatal(err)
	}
}
func middleware1() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware1 start")
		c.Next()
		fmt.Println("middleware1 end")
	}
}

func middleware2() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware2 start")
		return
		fmt.Println("middleware2 end")
	}
}

func middleware3() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware3 start")
		c.Next()
		fmt.Println("middleware3 end")
	}
}
bash 复制代码
middleware1 start
middleware2 start
middleware3 start
process request
middleware3 end
middleware1 end
  • 总结
    中间件的执行顺序是按照注册顺序执行的,中间件可以通过 retrurn 来中止当前中间件的后续处理流程。

c.abort() +return

  • 测试代码
bash 复制代码
package main

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

func main() {
	g := gin.New()
	g.Use(middleware1(), middleware2(), middleware3())
	g.GET("/", func(c *gin.Context) {
		fmt.Println("process request")
		c.JSON(http.StatusOK, "hello,world!")
	})
	err := g.Run()
	if err != nil {
		log.Fatal(err)
	}
}
func middleware1() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware1 start")
		c.Next()
		fmt.Println("middleware1 end")
	}
}

func middleware2() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware2 start")
		c.Abort()
		return
		fmt.Println("middleware2 end")
	}
}

func middleware3() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("middleware3 start")
		c.Next()
		fmt.Println("middleware3 end")
	}
}
bash 复制代码
middleware1 start
middleware2 start
middleware1 end
  • 总结
    中间件的执行顺序是按照注册顺序执行的,中间件可以通过 c.abort() + retrurn 来中止当前中间件,后续中间件和处理器的处理流程。
相关推荐
吴声子夜歌11 小时前
Go——并发编程
开发语言·后端·golang
geovindu14 小时前
go: Lock/Mutex Pattern
开发语言·后端·设计模式·golang·互斥锁模式
码农阿豪1 天前
Go 语言操作金仓数据库(上篇):环境搭建与连接管理
开发语言·数据库·golang
码农阿豪1 天前
Go 语言操作金仓数据库(下篇):SQL 执行、类型映射与超时控制
数据库·sql·golang
IT策士1 天前
Python 中间件系列:文件存储minio操作操
开发语言·python·中间件
驾驭人生1 天前
企业级微服务基础设施 | Docker Compose 9 大中间件 本地私有仓库 一键部署脚本前言
docker·微服务·中间件
~|Bernard|1 天前
五,go语言的内存管理
开发语言·后端·golang
IT策士1 天前
Python 中间件系列:消息队列 RabbitMQ 操作
python·中间件·rabbitmq
君万1 天前
【LeetCode每日一题】3. 无重复字符的最长子串 560. 和为 K 的子数组
算法·leetcode·golang·go
祁_z1 天前
Pydantic 数据校验 & 限流中间件(限制每个 IP 的请求频率,防止接口被刷爆)
网络协议·tcp/ip·中间件