当前位置: 首页 > article >正文

Java转Go日记(五十七):gin 中间件

1. 全局中间件

  • 所有请求都经过此中间件
package mainimport ("fmt""time""github.com/gin-gonic/gin"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 注册中间件r.Use(MiddleWare())// {}为了代码规范{r.GET("/ce", func(c *gin.Context) {// 取值req, _ := c.Get("request")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})}r.Run()
}

输出结果:

 注意: 请注意黑色的数据里面有一步算时间差没有执行(需要学习Next就懂了)

2. Next()方法

package mainimport ("fmt""time""github.com/gin-gonic/gin"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")// 执行函数c.Next()// 中间件执行完后续的一些事情status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 注册中间件r.Use(MiddleWare())// {}为了代码规范{r.GET("/ce", func(c *gin.Context) {// 取值req, _ := c.Get("request")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})}r.Run()
}

输出结果:

 

3. 局部中间件

package mainimport ("fmt""time""github.com/gin-gonic/gin"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")// 执行函数c.Next()// 中间件执行完后续的一些事情status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()//局部中间键使用r.GET("/ce", MiddleWare(), func(c *gin.Context) {// 取值req, _ := c.Get("request")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})r.Run()
}

效果演示:

 

4. 中间件练习

  • 定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间,如下:
package mainimport ("fmt""time""github.com/gin-gonic/gin"
)// 定义中间
func myTime(c *gin.Context) {start := time.Now()c.Next()// 统计时间since := time.Since(start)fmt.Println("程序用时:", since)
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 注册中间件r.Use(myTime)// {}为了代码规范shoppingGroup := r.Group("/shopping"){shoppingGroup.GET("/index", shopIndexHandler)shoppingGroup.GET("/home", shopHomeHandler)}r.Run(":8000")
}func shopIndexHandler(c *gin.Context) {time.Sleep(5 * time.Second)
}func shopHomeHandler(c *gin.Context) {time.Sleep(3 * time.Second)
}

 效果演示:

http://www.lryc.cn/news/2401076.html

相关文章:

  • 《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
  • 在本地查看服务器上的TensorBoard
  • 硬件开发全解:从入门教程到实战案例与丰富项目资源
  • 嵌入式学习笔记 - freeRTOS的两种临界禁止
  • 202403-02-相似度计算 csp认证
  • 【Oracle】游标
  • MySQL 中 char 与 varchar 的区别
  • DeepSeek 赋能智能零售,解锁动态定价新范式
  • 在Flutter中定义全局对象(如$http)而不需要import
  • <4>, Qt窗口
  • 6.04打卡
  • 【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南
  • Ubuntu中TFTP服务器安装使用
  • Spring Boot微服务架构(十):Docker与K8S部署的区别
  • 接口重试的7种常用方案!
  • vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定
  • pikachu靶场通关笔记13 XSS关卡09-XSS之href输出
  • MCP客户端Client开发流程
  • 学习日记-day21-6.3
  • C语言探索之旅:深入理解结构体的奥秘
  • uniapp 开发企业微信小程序,如何区别生产环境和测试环境?来处理不同的服务请求
  • Dockerfile常用指令介绍
  • Docker 容器化:核心技术原理与实践
  • 不确定性分析在LEAP能源-环境系统建模中的整合与应用
  • 经典算法回顾之最小生成树
  • Ubuntu下实现nginx反向代理
  • c++ QicsTable使用实例
  • 在WordPress上添加隐私政策页面
  • 二维 根据矩阵变换计算镜像旋转角度
  • 你工作中涉及的安全方面的测试有哪些怎么回答