当前位置: 代码网 > it编程>前端脚本>Golang > go gin中间件关于 c.next()、c.abort()和return的使用小结

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

2024年06月01日 Golang 我要评论
c.netx()测试代码package mainimport ("fmt""github.com/gin-gonic/gin""log""net/http")func main() {g := gin

c.netx()

测试代码

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")
	}
}

访问 http://127.0.0.1:8080 执行结果如下,浏览器输出 “hello,world!”

middleware1 start
middleware2 start
process request
middleware2 end
middleware1 end

总结
中间件的执行顺序是按照注册的顺序执行的,在中间件中使用 c.next() 方法,会先执行c.next() 前面的,然后将控制权传递给下一个中间件或处理器,最后按照相反顺序执行中间件c.next() 后面的代码。 c.abort() 测试代码

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")
	}
}

访问 http://127.0.0.1:8080 执行结果如下,浏览器无输出

middleware1 start
middleware2 start
middleware2 end
middleware1 end

总结
中间件的执行顺序是按照注册顺序执行的,中间件可以通过 c.abort() 来中止后续中间件或处理器的处理流程。

return 测试代码

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")
	}
}

访问 http://127.0.0.1:8080 执行结果如下,浏览器输出 “hello,world!”

middleware1 start
middleware2 start
middleware3 start
process request
middleware3 end
middleware1 end

总结
中间件的执行顺序是按照注册顺序执行的,中间件可以通过 retrurn 来中止当前中间件的后续处理流程。

c.abort() +return 测试代码

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")
	}
}

访问 http://127.0.0.1:8080 执行结果如下,浏览器无输出

middleware1 start
middleware2 start
middleware1 end

总结
中间件的执行顺序是按照注册顺序执行的,中间件可以通过 c.abort() + retrurn 来中止当前中间件,后续中间件和处理器的处理流程。 

到此这篇关于go gin中间件关于 c.next()、c.abort()和return的使用的文章就介绍到这了,更多相关go gin中间件c.next()、c.abort()和return内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com