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.RouterGroupGroup 方法来创建一个带有自定义中间件的路由组。例如:

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. 2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。

    2021-08-13:给定一个每一行有序.每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数. 福大大 答案2021-08-13: 二分法. 代码用golang编 ...

  2. Vulnhub Broken

    Vulnhub Broken 一.操作文档 [Vulnhub - Broken-Gallery writeup (mzfr.me)](https://blog.mzfr.me/vulnhub-writ ...

  3. 如何通过Java代码将 PDF文档转为 HTML格式

    虽然PDF文件适合用于打印和发布,但不适合所有类型的文档.例如,包含复杂图表和图形的文档可能无法在PDF中呈现得很好.但是HTML文件可以在任何可运行浏览器的计算机上进行阅读并显示.并且HTML还具有 ...

  4. Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...

  5. Cronjob 定时任务

    Job: 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束. CronJob: 则就是在Job上加上了时间调度. 我们用Job这个资源对象来创建一个任务,我们定一个Job来 ...

  6. C# 图片转PDF,PDF增加水印文字

    好久没写博客了,今天给大家分享一个图片转PDF的相关操作,也算是一次总结吧. 首先需要准备动态库itextsharp.dll,这个dll去网上下载,都可以下载到,C#对PDF的操作都是基于这个类库来实 ...

  7. 【论文阅读】CYCADA CYCLE-CONSISTENT ADVERSARIAL DOMAIN ADAPTATION

    github code CyCADA论文中,定义了一种问题--无监督适配,即仅提供源数据 \(X_S\) 和源标签 \(Y_S\),以及源域目标数据\(X_T\),没有目标标签或者不利用它.问题的目的 ...

  8. 学习websocket,原来这么简单

    简单介绍 websocket WebSocket是一种在TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准. 然后WebSocket API也被W3C定为标准 ...

  9. 记一次 .NET 某埋线管理系统 崩溃分析

    一:背景 1. 讲故事 经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐 ...

  10. LRU 力扣 146 https://leetcode.cn/problems/lru-cache/

    一道经典题目,用双向链表去做能够满足O1的复杂度 核心代码如下 class LRUCache {    MyLinkedList myLinkedList;    int size;    int c ...