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

Gin框架中的全局中间件与中间件传值

Gin是一个用Go语言编写的Web框架,它以高性能和简洁的API而闻名。在Gin中,中间件是一种在请求处理流程中执行特定任务的函数,这些任务可能包括日志记录、用户认证、请求限流等。中间件可以在全局范围内使用,也可以仅应用于特定的路由或路由组。

全局中间件

全局中间件会应用于所有的请求,无论请求的路径是什么。在Gin中,可以通过r.Use()方法来注册全局中间件。注册的中间件会按照它们注册的顺序执行。

中间件传值

Gin的中间件可以通过上下文(*gin.Context)来传递数据。上下文是一个包含了请求和响应的封装,它允许中间件和处理函数之间传递数据。使用c.Set()方法可以在上下文中存储数据,而c.Get()c.MustGet()方法则用于从上下文中获取数据。

示例代码解析

以下是一个使用Gin框架的示例代码,展示了如何定义全局中间件以及如何在中间件之间传递数据。

package main

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

// User 定义了一个用户结构体,包含姓名和年龄
type User struct {
	Name string
	Age  int
}

// m10 是一个中间件函数,用于设置上下文数据
func m10(c *gin.Context) {
	fmt.Println("m10...in")
	// 使用c.Set向gin的上下文中存储数据
	c.Set("num", 10)
	c.Set("user", User{"zhangsan", 18})
	// 调用c.Next()来执行下一个中间件或路由处理函数
	c.Next()
	fmt.Println("m10...out")
}

// m11 是一个中间件函数,用于获取上下文数据
func m11(c *gin.Context) {
	fmt.Println("m11...in")
	// 使用c.Get从gin的上下文中获取数据,exists用于判断数据是否存在
	value, exists := c.Get("num")
	if exists {
		fmt.Println(value)
	}
	// c.MustGet确保数据一定存在,如果不存在会返回一个panic
	fmt.Println(c.MustGet("user"))
	_user, _ := c.Get("user")
	// 类型断言,将接口类型转换为User类型,并访问Name字段
	fmt.Println(_user.(User).Name)
	// 调用c.Next()来执行下一个中间件或路由处理函数
	c.Next()
	fmt.Println("m11...out")
}

func main() {
	// 创建默认的gin路由器
	r := gin.Default()
	// 使用r.Use将m10和m11中间件绑定到每个请求中
	r.Use(m10, m11)
	// 定义路由/m10,响应GET请求,返回JSON数据
	r.GET("/m10", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "m10"})
	})
	// 定义路由/m11,响应GET请求,返回JSON数据
	r.GET("/m11", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "m11"})
	})
	// 启动gin服务器,监听localhost的8080端口
	r.Run("localhost:8080")
}

运行结果

当访问/m11路由时,控制台输出如下:

m10...in
m11...in
10
{zhangsan 18}
zhangsan
m11...out
m10...out

总结

通过这个示例,我们可以看到如何在Gin中使用全局中间件以及如何在中间件之间传递数据。m10中间件在请求处理流程的早期设置数据,而m11中间件则在稍后获取并使用这些数据。这种模式在处理跨请求的共享数据时非常有用。


http://www.kler.cn/a/290941.html

相关文章:

  • Redis 集群实操:强大的数据“分身术”
  • 解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题
  • 网络安全防范
  • RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究
  • 集成自然语言理解服务,让应用 “听得懂人话”
  • 厦门凯酷全科技有限公司短视频带货可靠吗?
  • IDEA 安装lombok插件不兼容的问题及解决方法
  • 【弱监督时间动作定位】Probabilistic Vision-Language Representation for WSTAL 论文阅读
  • Linux shell调试:高效定位错误提高脚本可靠性
  • 修改SpringBoot启动图标banner
  • 使用AI写WebSocket知识是一种怎么样的体验?
  • 17. 如何决定使用ArrayList或LinkedList?在什么情况下选择其中之一?
  • 【Linux】进程周边:进程概念
  • RabbitMQ 入门:基本概念、特性及简单示例
  • 职场关系课:辞退下属的行动指南
  • 智能医学(二)——MDPI特刊推荐
  • HarmonyOS开发实战( Beta5.0)自定义组件冻结功能规范
  • flowable 国产数据库并发性能优化
  • Linux 学习之路 - 信号的保存
  • BUUCTF Crypto wp--RSA1
  • 记一种常用的实时数据同步方案:Canal+Kafka+Flume
  • Nacos Config的配置中心
  • react文件详情
  • 去中心化身份(DID)与你:SOEX安全的交易未来
  • three.js 图片加载器
  • 深入解析Java中的分布式事件流处理:从Kafka Streams到Apache Flink