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

2024-09-04 15:12

本文主要是介绍Gin框架中的全局中间件与中间件传值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

全局中间件

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

中间件传值

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

示例代码解析

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

package mainimport ("fmt""github.com/gin-gonic/gin"
)// User 定义了一个用户结构体,包含姓名和年龄
type User struct {Name stringAge  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确保数据一定存在,如果不存在会返回一个panicfmt.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中间件则在稍后获取并使用这些数据。这种模式在处理跨请求的共享数据时非常有用。

这篇关于Gin框架中的全局中间件与中间件传值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136317

相关文章

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH