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 来中止当前中间件,后续中间件和处理器的处理流程。
相关推荐
茉莉玫瑰花茶40 分钟前
GO [ 泛型 ]
golang
今年下半年4 小时前
【Spring Boot】多种存储文件(FastDFS / MinIO / 阿里云 OSS)接入设计说明(附源码)
spring boot·分布式·中间件·简单工厂模式·策略模式
念何架构之路10 小时前
go-grpc服务端调用
开发语言·后端·golang
茉莉玫瑰花茶11 小时前
GO [ 单元测试 ]
golang·单元测试·log4j
青山木12 小时前
秒杀系统设计(二):数据正确性——防超卖、分布式锁与一人一单
分布式·后端·mysql·中间件·架构
喵了几个咪12 小时前
Go 写业务,Rust 扛底盘:一套可落地的混合架构
微服务·架构·golang·rust·多租户·gowind·rushwind
ttwuai12 小时前
Golang Web后台管理框架推荐:Gin、GoFrame与数据面板项目怎么分
前端·golang·gin
魏码不凡13 小时前
Go 编译报错:undefined: webp.Encode 问题排查与解决
开发语言·后端·golang
tachibana214 小时前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
Maiko Star14 小时前
* LangChain 自定义中间件详解:Hook、装饰器、类与执行顺序
中间件·langchain