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 来中止当前中间件,后续中间件和处理器的处理流程。
相关推荐
大树912 小时前
把 Java 项目从手动 SCP 升级到 Gitee Go 自动部署:一份踩坑实录
java·golang·gitee
lmy_loveF2 小时前
go 切换go version 版本
开发语言·后端·golang
智购科技自动贩卖机4 小时前
自动售货机嵌入式系统安全加固实践:从Go语言国密算法到硬件防拆的工程化落地
大数据·人工智能·后端·安全·golang·系统安全
妙码生花19 小时前
使用git更新ai-go-admin框架
前端·人工智能·git·golang·typescript·php
王的宝库21 小时前
GO常用标准库包
开发语言·后端·golang
平头哥AI1 天前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang
JavaPub-rodert1 天前
后台操作日志千万别同步写库:从 ShiyuAdmin 看 Gin 异步审计日志设计
gin
我不会起名字3221 天前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
FfHUCisI1 天前
Golang 网络轮询器 netpoll:把阻塞 IO 变成事件通知
开发语言·网络·golang