Go Gin中间件

news2024/11/28 4:27:36

Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。

以下是关于Gin中间件开发的一些基本信息:

  • 中间件的定义:在Gin中,中间件是一个函数,它接受一个gin.Context参数,并返回一个函数。这个函数在处理HTTP请求时被调用。
  • 中间件的使用:你可以使用gin.Engine.Use()函数来添加全局中间件,或者使用gin.RouterGroup.Use()函数来添加特定路由组的中间件。
  • 中间件的执行顺序:中间件的执行顺序是按照它们被添加的顺序来的。全局中间件总是先于路由组中间件被执行。
  • 中间件的错误处理:如果中间件在执行过程中出现错误,你可以使用gin.Context.Abort()函数来停止后续的处理。

那如何开发 Gin 的中间件呢?

1. 创建中间件函数

中间件实际上是一个函数,它接收 gin.Context 对象作为参数。gin.Context 包含了当前请求的信息和响应的相关方法。以下是一个简单的中间件示例,用于记录请求的路径和方法:

func LoggerMiddleware(c *gin.Context) {
    // 在请求处理前打印请求路径和方法
    fmt.Printf("Request: %s %s\n", c.Request.Method, c.Request.URL.Path)
    
    // 继续处理请求
    c.Next()
    
    // 在响应发送后打印响应状态码
    fmt.Printf("Response status: %d\n", c.Writer.Status())
}

2. 注册中间件

要使用中间件,需要将中间件函数注册到路由组或全局中。以下是如何注册上述 LoggerMiddleware 中间件的示例:

func main() {
    // 创建 Gin 引擎
    r := gin.Default()
    
    // 注册中间件到全局
    r.Use(LoggerMiddleware)
    
    // 定义路由
    r.GET("/hello", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello, World!")
    })
    
    // 启动服务器
    r.Run(":8080")
}

在上述代码中,r.Use(LoggerMiddleware) 将 LoggerMiddleware 中间件注册到了全局,意味着所有的请求都会经过这个中间件的处理。你也可以将中间件注册到特定的路由组,以使其仅对特定路由生效。

3. 中间件链

你可以在一个路由上同时使用多个中间件,它们会按照注册的顺序执行。这样,你可以实现多个中间件的组合来完成不同的功能。以下是一个使用多个中间件的示例:

func AuthMiddleware(c *gin.Context) {
    // 在这里进行身份验证逻辑
    // ...
    
    // 继续处理请求
    c.Next()
}
 
func main() {
    r := gin.Default()
    
    // 注册多个中间件
    r.Use(LoggerMiddleware, AuthMiddleware)
    
    // ...
}

4. 中间件的顺序

中间件的注册顺序很重要,因为它们会按照注册的顺序依次执行。例如,如果你的身份验证中间件需要在日志记录中间件之后执行,那么确保在注册时的顺序是正确的。

5. 中间件的优先级

有时,你可能希望某个路由上的中间件执行顺序与全局中的不同。在 Gin 中,你可以使用 gin.RouterGroup 的 Group 方法来创建一个带有自定义中间件的路由组。例如:

func main() {
    r := gin.Default()
    
    // 创建带有自定义中间件的路由组
    authGroup := r.Group("/auth", AuthMiddleware)
    
    // 在路由组上注册其他中间件
    authGroup.Use(LoggerMiddleware)
    
    // 在路由组上定义路由
    authGroup.GET("/profile", func(c *gin.Context) {
        c.String(http.StatusOK, "User profile")
    })
    
    r.Run(":8080")
}

在上述示例中,AuthMiddleware 会首先执行,然后是 LoggerMiddleware

通过上述步骤,你可以轻松地在 Gin 框架中开发中间件来实现各种功能,如身份验证、日志记录、错误处理等。中间件的灵活性使得你可以将常用的功能模块抽象出来,使代码更具可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络 - 自顶向下方法】第一章习题答案

P2 Question:   式 (1-1) 给出了经传输速率为 R 的 N 段链路发送长度为 L 的一个分组的端到端时延。 对于经过 N 段链路一个接一个地发送 P 个这样的分组,一般化地表示出这个公式。 Answer:    N ∗ L R \frac{N*L}{R} RN∗L​ 时&…

【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取(北斗、GPS和GNSS)

【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取(北斗、GPS和GNSS) 测试视频(其中的恶性BUG会在下一篇文章阐述): 【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG(目前没有完全的…

Python语言:容器操作知识点总结清单

容器通用操作表格: 列表知识点清单: 元组知识点清单: 字典知识点清单: 集合知识点清单: 字符串知识点清单: 说明:本次知识点总结可能会有遗漏,没有做到面面俱到。

联通智网科技正式入选国家级专精特新“小巨人”企业

近日,北京市经济和信息化局发布《第五批专精特新“小巨人”企业公告名单》,根据工业和信息化部发布的《工业和信息化部关于公布第五批专精特新“小巨人”企业和通过复核的第二批专精特新“小巨人”企业名单的通告》,联通智网科技股份有限公司…

Java自学第3课:Java语言流程控制和字符串

1 复合语句 复合语句是以区块为单位的语句&#xff0c;也就是{}内的内容。 2 条件语句 if (布尔表达式){语句序列}else{语句序列} 有个好玩的是&#xff0c;对年龄段的分段&#xff0c;其实以前的思维是有点冗余的&#xff0c;比如a<100 & a>90&#xff0c;在复合…

蛋白质N端测序服务

表达纯化后的蛋白产物&#xff0c;特别是蛋白品的分析过程中&#xff0c;需要对蛋白的末端进行验证&#xff0c;以保证表达纯化产物的N端和C端序列准确。Edman降解法是蛋白的N端序列分析中非常成熟的方法之一&#xff0c;有着广泛的应用。卡梅德生物采用岛津公司Edman测序系统&…

C++定义一个 Student 类,在该类定义中包括:一个数据成员 score(分数)及两个静态数据 成员 total(总分)和学生人数 count

完整代码&#xff1a; /*声明一个Student类&#xff0c;在该类中包括一个数据成员score&#xff08;分数&#xff09;、两个静态数据成员total_score&#xff08;总分&#xff09;和count&#xff08;学生人数&#xff09;&#xff1b;还包括一个成员函数account&#xff08;&…

Redis缓存穿透、击穿、雪崩问题原理和解决方案

目录 一、Redis缓存穿透1.1、缓存穿透原理1.2、缓存穿透代码演示1.3、缓存穿透解决方案解决方案一&#xff08;数据库中查询不到数据也将key进行缓存&#xff09;解决方案二&#xff08;使用布隆过滤器&#xff09; 二、Redis缓存击穿&#xff08;缓存失效&#xff09;三、Redi…

KV STUDIO对plc的读取与电焊机的配料设置

今天又开始了明天的工作总结&#xff0c;希望对于看小编博客的粉丝有所帮助&#xff0c;前程似锦&#xff01;&#xff01;&#xff01; KV STUDIO对plc的读取 一&#xff0c;先将电脑与设备相连接&#xff0c;有许多种发生&#xff0c;小编这使用的是以太网方式 二&#xff0…

倒计时丨距离RestCloud新品发布仅有6天!

6天倒计时&#xff0c;RestCloud零代码集成自动化平台重磅发布 ⏰11月9日14:00&#xff0c;期待您的参与&#xff01; 点击报名&#xff1a;http://c.nxw.so/dfaJ9

【LeetCode刷题-链表】--146.LRU缓存

146.LRU缓存 方法一&#xff1a;哈希表双向链表 使用一个哈希表和一个双向链表维护所有在缓存中的键值对 双向链表按照被使用的顺序存储了这些键值对&#xff0c;靠近头部的键值对是最近使用的&#xff0c;而靠近尾部的键值对是最久使用的哈希表即为普通的哈希映射&#xff0…

Java基础之类型(内涵面试题)

目录 一、自动类型转换&#xff1a; 二、强制类型转换&#xff1a; 1.强制类型转换可能造成数据丢失&#xff08;溢出&#xff09;。 2.浮点型强转成整型&#xff0c;直接丢掉小数部分&#xff0c;保留整数部分返回。 三、自增、自减&#xff08;、--&#xff09;有关面试题…

JavaScript设计模式之发布-订阅模式

发布者和订阅者完全解耦&#xff08;通过消息队列进行通信&#xff09; 适用场景&#xff1a;功能模块间进行通信&#xff0c;如Vue的事件总线。 ES6实现方式&#xff1a; class eventManager {constructor() {this.eventList {};}on(eventName, callback) {if (this.eventL…

【凡人修仙传】定档曝光,最新更新时间有所调整,期待值暴涨

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;备受瞩目的动漫作品《凡人修仙传》终于在新年之际宣布定档了&#xff01;这个消息让广大动漫爱好者们激动不已。在某知名视频网站上&#xff0c;这部作品的官方发布了一个名为“新年番定…

在 Python 中创建奇数列表

我们将在本文中介绍在 Python 中创建奇数列表的不同方法。 Python 中的奇数 定义奇数有两种方法&#xff0c;第一种是整数不能被 2 整除时的情况。另一种是整数除以 2 时余数为 1 的情况。 例如&#xff0c;1、5、9、11、45等都是奇数。 从列表中获取奇数的方法有很多&#x…

Attention is all you need 论文阅读

论文链接 Attention is all you need 0. Abstract 主要序列转导模型基于复杂的循环或卷积神经网络&#xff0c;包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器提出Transformer&#xff0c;它 完全基于注意力机制&#xff0c;完全不需要递归和卷积对两…

为什么我们要重视学历提升?因为“一纸文凭”就是我们重要的通行证!

在当下社会内卷越来越紧的时代&#xff0c;“一纸文凭”就是我们最重要的通行证&#xff0c;可能学历背景不够好&#xff0c;在职场上就难以获得发展&#xff0c;未来规划也无法成功。 学历提升的重要性 1.就业 现在的就业市场越来越看重一个人的学历出身&#xff0c;单位招…

【小白的Spring源码手册】 Bean的扫描、装配和注册,面试学习可用

目录 前言源码学习Bean配置1. 注解2. xml配置 Bean扫描、装配、注册1. 扫描2. 装配BeanDefinition3. 校验BeanDefinition4. 注册BeanDefinition 总结 前言 如今Spring框架功能众多&#xff0c;每次打开Spring源码&#xff0c;要么就是自顶向下从整个框架来了解Spring整体流程&…

YOLOv5:按每个类别的不同置信度阈值输出预测框

YOLOv5&#xff1a;按每个类别的不同置信度阈值输出预测框 前言前提条件相关介绍YOLOv5&#xff1a;按每个类别的不同置信度阈值输出预测框预测修改detect.py输出结果 验证修改val.py输出结果 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更…

关于FastJSON序列化Bean时对get方法调用的细节

结论 使用JSON.toJSONString去序列化Bean的时候 FastJSON会把Bean里面的get开头&#xff0c;有返回值且没有参数的方法都调用一遍。 看代码 package org.example.domain;import lombok.Getter; import lombok.Setter;/*** program: parent_pro* description:* author: 渭水* c…