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 框架中开发中间件来实现各种功能,如身份验证、日志记录、错误处理等。中间件的灵活性使得你可以将常用的功能模块抽象出来,使代码更具可维护性和可扩展性。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


Gin中间件开发的更多相关文章

  1. 【Gin-API系列】Gin中间件之日志模块(四)

    日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...

  2. 【Gin-API系列】Gin中间件之异常处理(六)

    本文我们介绍生产环境上如何通过捕捉异常recovery来完善程序设计和提高用户体验. Golang异常处理 golang 的异常处理比较简单,通常都是在程序遇到异常崩溃panic之后通过defer调用 ...

  3. 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)

    功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...

  4. golang程序设计:Go middleware中间件以及Gin 中间件分析

    先从业务开发角度出发,来逐渐引出中间件. 一.刚开始时业务开发 开始业务开发时,业务需求比较少. 当我们最开始进行业务开发时,需求不是很多. 第一个需求产是品向大家打声招呼:"hello w ...

  5. 01 . Go之Gin+Vue开发一个线上外卖应用

    项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...

  6. gin中间件推荐

    中间件推荐 1.1.1. 列表 谷歌翻译欢迎查看原文 https://github.com/gin-gonic/contrib/blob/master/README.md RestGate - RES ...

  7. Owin学习笔记(二) 中间件开发

    Owin中也有类似于ASP.NET的管道,以前在做ASP.NET项目的时候,可以制作很多不同功能HttpHandler或者HttpModule并注册在Web.config中重复使用.在Owin的管道中 ...

  8. 【Gin-API系列】Gin中间件之鉴权访问(五)

    在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...

  9. 02 . 02 . Go之Gin+Vue开发一个线上外卖应用(集成第三方发送短信和xorm生成存储数据库表)

    集成第三方发送短信 介绍 用户登录 用户登录有两种方式: 短信登录,密码登录 短信登录是使用手机号和验证码进行登录 短信平台 很多云平台,比如阿里云,腾讯云,七牛云等云厂商,向程序开发者提供了短信验证 ...

  10. 用IBM MQ中间件开发碰到的MQRC_NOT_AUTHORIZED(2035)问题

    我在一台工作站上面部署了MQ服务器,在MQ服务器中我建立了队列管理器MQ_TEST,在该队列管理器中我建立了一个本地队列MQ_Q以及一个服务器连接通道MQ_C,MQ_C中的MCA用户标识默认为空.同时 ...

随机推荐

  1. Selenium - 元素定位(2) - XPATH进阶

    Selenium - 元素定位 XPATH 定位进阶 元素示例 属性定位 # xpath 通过id属性定位 driver.find_element_by_xpath("//*[@id='kw ...

  2. TestForPicGo

    如果显示,则为成功 否则,失败 同时为CN-BLOG的vscode插件进行测试

  3. 【Java】包名规范及整理

    目录 前言 包名规范 总结 前言 最近学习Java的时候,有一个 class 需要在每一个 java文件中写一写,然后我喜欢一次实验的java文件放到一个 Package 中,这就导致了持续不断的报错 ...

  4. Abaqus结构仿真软件的非线性问题与解决方案

    ​无论是什么FEA 软件,想要获得非线性问题的一些解决方法始终没有那么简单.遇到问题是很常见的,那么下面就来看看Abaqus用户克服这一类问题的解决方法吧. 1. 简化模型 从简化模型开始,通过逐渐添 ...

  5. Windows 11 和 Rocky 9 Linux 平台 MySQL 8.0.33 简易安装教程

    目录 Windows 平台安装 MySQL Linux 平台 Rocky 9 安装 MySQL binary package rpm package yum 源 source package Wind ...

  6. vue+iview 动态调整Table的列顺序

    需求:因table列太多,且每个部门关注的信息不一样,拖来拖去不方便观看,客户想让Table列可以拖动,且可以保存顺序. 但是搞动态拖动太难了,我不会,于是改为操作columns数据 思路: < ...

  7. 沉痛悼念 pip search 一路走好

    不知道最近大家有没有发现在使用 pip search 的时候,总是出现一个 XMLRPC 的报错. $ pip search xlrdERROR: XMLRPC request failed [cod ...

  8. Conda 为什么越来越慢?

    作者:生信宝典 | 生信宝典公众号原文:https://mp.weixin.qq.com/s/OkOgN4j44MHNt1_noPVpzA Conda 为什么越来越慢? Conda 中包含的软件越来越 ...

  9. CANoe学习笔记(三):CANoe的诊断功能和cdd文件

    内容: UDS诊断学习 CDD文件配置 诊断功能 一.UDS诊断学习: ①.UDS请求命令4种构成方式: SIDSID+SF(Sub-function)SID+DID(Data Identifier) ...

  10. Kubernetes使用Harbor作为私有镜像仓库

    概述 Harbor使用了基于角色的访问控制策略,当从Harbor中拉去镜像的时候,首先要进行身份认证,认证通过后才可以拉取镜像.在命令行模式下,需要先执行docker login,登陆成功后,才可以d ...