Gin中间件开发
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中间件开发的更多相关文章
- 【Gin-API系列】Gin中间件之日志模块(四)
日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...
- 【Gin-API系列】Gin中间件之异常处理(六)
本文我们介绍生产环境上如何通过捕捉异常recovery来完善程序设计和提高用户体验. Golang异常处理 golang 的异常处理比较简单,通常都是在程序遇到异常崩溃panic之后通过defer调用 ...
- 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)
功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...
- golang程序设计:Go middleware中间件以及Gin 中间件分析
先从业务开发角度出发,来逐渐引出中间件. 一.刚开始时业务开发 开始业务开发时,业务需求比较少. 当我们最开始进行业务开发时,需求不是很多. 第一个需求产是品向大家打声招呼:"hello w ...
- 01 . Go之Gin+Vue开发一个线上外卖应用
项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...
- gin中间件推荐
中间件推荐 1.1.1. 列表 谷歌翻译欢迎查看原文 https://github.com/gin-gonic/contrib/blob/master/README.md RestGate - RES ...
- Owin学习笔记(二) 中间件开发
Owin中也有类似于ASP.NET的管道,以前在做ASP.NET项目的时候,可以制作很多不同功能HttpHandler或者HttpModule并注册在Web.config中重复使用.在Owin的管道中 ...
- 【Gin-API系列】Gin中间件之鉴权访问(五)
在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...
- 02 . 02 . Go之Gin+Vue开发一个线上外卖应用(集成第三方发送短信和xorm生成存储数据库表)
集成第三方发送短信 介绍 用户登录 用户登录有两种方式: 短信登录,密码登录 短信登录是使用手机号和验证码进行登录 短信平台 很多云平台,比如阿里云,腾讯云,七牛云等云厂商,向程序开发者提供了短信验证 ...
- 用IBM MQ中间件开发碰到的MQRC_NOT_AUTHORIZED(2035)问题
我在一台工作站上面部署了MQ服务器,在MQ服务器中我建立了队列管理器MQ_TEST,在该队列管理器中我建立了一个本地队列MQ_Q以及一个服务器连接通道MQ_C,MQ_C中的MCA用户标识默认为空.同时 ...
随机推荐
- 2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。
2021-08-13:给定一个每一行有序.每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数. 福大大 答案2021-08-13: 二分法. 代码用golang编 ...
- Vulnhub Broken
Vulnhub Broken 一.操作文档 [Vulnhub - Broken-Gallery writeup (mzfr.me)](https://blog.mzfr.me/vulnhub-writ ...
- 如何通过Java代码将 PDF文档转为 HTML格式
虽然PDF文件适合用于打印和发布,但不适合所有类型的文档.例如,包含复杂图表和图形的文档可能无法在PDF中呈现得很好.但是HTML文件可以在任何可运行浏览器的计算机上进行阅读并显示.并且HTML还具有 ...
- Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍
fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...
- Cronjob 定时任务
Job: 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束. CronJob: 则就是在Job上加上了时间调度. 我们用Job这个资源对象来创建一个任务,我们定一个Job来 ...
- C# 图片转PDF,PDF增加水印文字
好久没写博客了,今天给大家分享一个图片转PDF的相关操作,也算是一次总结吧. 首先需要准备动态库itextsharp.dll,这个dll去网上下载,都可以下载到,C#对PDF的操作都是基于这个类库来实 ...
- 【论文阅读】CYCADA CYCLE-CONSISTENT ADVERSARIAL DOMAIN ADAPTATION
github code CyCADA论文中,定义了一种问题--无监督适配,即仅提供源数据 \(X_S\) 和源标签 \(Y_S\),以及源域目标数据\(X_T\),没有目标标签或者不利用它.问题的目的 ...
- 学习websocket,原来这么简单
简单介绍 websocket WebSocket是一种在TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准. 然后WebSocket API也被W3C定为标准 ...
- 记一次 .NET 某埋线管理系统 崩溃分析
一:背景 1. 讲故事 经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐 ...
- LRU 力扣 146 https://leetcode.cn/problems/lru-cache/
一道经典题目,用双向链表去做能够满足O1的复杂度 核心代码如下 class LRUCache { MyLinkedList myLinkedList; int size; int c ...