前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang Gin 实战(十三)| 中间件详解看这一篇就够了

Golang Gin 实战(十三)| 中间件详解看这一篇就够了

作者头像
飞雪无情
发布于 2020-06-30 02:28:01
发布于 2020-06-30 02:28:01
4.9K723
代码可运行
举报
运行总次数:3
代码可运行

在Gin的整个实现中,中间件可谓是Gin的精髓。一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且中间件之间相互不用感知到,每个中间件只需要处理自己需要处理的事情即可。今天我们就通过这篇文章,详细的介绍Gin中间的使用和原理。

通过这篇文章你可以学到:

  1. Gin中间件入门
  2. 如何使用Gin的默认中间件
  3. 中间件实现HTTP Basic Authorization
  4. 基于分组路由的中间件控制
  5. 自定义一个统计耗时的中间件
  6. 中间件的设计模式-责任链
  7. 自己实现一个责任链模式
  8. 中间件Next方法的实现原理
  9. Gin中间件源码分析
  10. Gin中间件面试要点

Gin默认中间件

在Gin中,我们可以通过Gin提供的默认函数,来构建一个自带默认中间件的*Engine

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r := gin.Default()

Default函数会默认绑定两个已经准备好的中间件,它们就是Logger 和 Recovery,帮助我们打印日志输出和painc处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}

从中我们可以看到,Gin的中间件是通过Use方法设置的,它接收一个可变参数,所以我们同时可以设置多个中间件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes

到了这里其实我们应该更加明白了,一个Gin的中间件,其实就是Gin定义的一个HandlerFunc,而它在我们Gin中经常使用,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r.GET("/", func(c *gin.Context) {
		fmt.Println("首页")
		c.JSON(200, "")
	})

后面的func(c *gin.Context)这部分其实就是一个HandlerFunc

中间件实现HTTP Basic Authorization

HTTP Basic Authorization 是HTTP常用的认证方案,它通过Authorization 请求消息头含有服务器用于验证用户代理身份的凭证,格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Authorization: Basic <credentials>

如果认证不成功,服务器返回401 Unauthorized 状态码以及WWW-Authenticate 消息头,让客户端输入用户名和密码进一步认证。

在Gin中,为我们提供了gin.BasicAuth帮我们生成基本认证的中间件,方便我们的开发。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	r := gin.Default()

	r.Use(gin.BasicAuth(gin.Accounts{
		"admin": "123456",
	}))
	
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, "首页")
	})
	
	r.Run(":8080")

我们添加一个用户名为admin,密码是123456的账户,用于HTTP 基本认证。现在我们运行启动,访问http://localhost:8080/,这时候只有我们输入正确的用户名和密码,才能看到首页,否则是看不到的,这样我们就达到了授权的目的,就是这么简单。

针对特定URL的Basic Authorization

其实在实际的项目开发中,我们基本上不太可能对所有的URL都进行认证的,一般只有一些需要认证访问的数据才需要认证,比如网站的后台,那么这时候我们就可以用分组路由来处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, "首页")
	})

	adminGroup := r.Group("/admin")
	adminGroup.Use(gin.BasicAuth(gin.Accounts{
		"admin": "123456",
	}))

	adminGroup.GET("/index", func(c *gin.Context) {
		c.JSON(200, "后台首页")
	})

	r.Run(":8080")
}

现在我们运行访问/首页是可以正常显示的,但是我们访问/admin/index会提示输入密码,其实所有/admin/*下的URL都会让输入密码才能访问,这就是我们分组路由的好处,我们通过把中间件加到/admin这个分组路由上,就可以达到我们的目的。

通过分组路由的控制,我们可以比较灵活的设置HTTP认证,粒度可以自己随意控制。

自定义中间件

我们已经知道,Gin的中间件其实就是一个HandlerFunc,那么只要我们自己实现一个HandlerFunc,就可以自定义一个自己的中间件。现在我们以统计每次请求的执行时间为例,来演示如何自定义一个中间件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func costTime() gin.HandlerFunc {
	return func(c *gin.Context) {
		//请求前获取当前时间
		nowTime := time.Now()

		//请求处理
		c.Next()

		//处理后获取消耗时间
		costTime := time.Since(nowTime)
		url := c.Request.URL.String()
		fmt.Printf("the request URL %s cost %v\n", url, costTime)
	}
}

以上我们就实现了一个Gin中间件,比较简单,而且有注释加以说明,这里要注意的是c.Next方法,这个是执行后续中间件请求处理的意思(含没有执行的中间件和我们定义的GET方法处理),这样我们才能获取执行的耗时。也就是在c.Next方法前后分别记录时间,就可以得出耗时。

有了自定义的中间件,我们就可以这么使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	r := gin.New()

	r.Use(costTime())

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, "首页")
	})

	r.Run(":8080")
}

现在启动程序,在浏览器里打开就可以看到如下日志信息了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
the request URL / cost 26.533µs

通过自定义中间件,我们可以很方便的拦截请求,来做一些我们需要做的事情,比如日志记录、授权校验、各种过滤等等。

责任链模式

在讲Gin的中间件的原理之前,我们先了解下设计模式中的责任链模式。顾名思义,责任链模式就是为请求创建一个对象链,对象链上的每个对象都可以依次对请求进行处理,并把处理过的请求传递给下一个对象。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年6月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
72 条评论
热度
最新
超赞
超赞
111举报
感谢您的支持与鼓励~欢迎继续参加我们的活动吆~
感谢您的支持与鼓励~欢迎继续参加我们的活动吆~
回复回复点赞举报
感觉错过了好多期奖品哈,啊啊啊啊啊(꒦_꒦) (꒦_꒦) (꒦_꒦)
感觉错过了好多期奖品哈,啊啊啊啊啊(꒦_꒦) (꒦_꒦) (꒦_꒦)
11点赞举报
你好~感谢你的支持。可以通过邮箱联系我们 cloud_document@tencent.com
你好~感谢你的支持。可以通过邮箱联系我们 cloud_document@tencent.com
回复回复点赞举报
只顾着提交问题了,没留心到获奖信息。可以给亲补发下么。(꒦_꒦) (꒦_꒦) (꒦_꒦)
只顾着提交问题了,没留心到获奖信息。可以给亲补发下么。(꒦_꒦) (꒦_꒦) (꒦_꒦)
回复回复点赞举报
获幸运奖品了。但是没收到信息错过了。能给补发下么。o(╥﹏╥)o
获幸运奖品了。但是没收到信息错过了。能给补发下么。o(╥﹏╥)o
回复回复点赞举报
66666
66666
11点赞举报
非常感谢您的支持与鼓励,期待您的参与~ 手动比心~ 2022年我们的奖品库更丰富了吆~
非常感谢您的支持与鼓励,期待您的参与~ 手动比心~ 2022年我们的奖品库更丰富了吆~
回复回复点赞举报
不错的活动
不错的活动
11点赞举报
非常感谢您的支持与鼓励,期待您的参与~ 手动比心~
非常感谢您的支持与鼓励,期待您的参与~ 手动比心~
回复回复点赞举报
好棒的活动
好棒的活动
11点赞举报
感谢您的支持与鼓励,欢迎参加文档活动吆~
感谢您的支持与鼓励,欢迎参加文档活动吆~
回复回复点赞举报
?牛年生肖公仔安排上呀,我要凑一套。来年好惦记虎?年生肖公仔
?牛年生肖公仔安排上呀,我要凑一套。来年好惦记虎?年生肖公仔
11点赞举报
好的,愿望已收到。后续争取尽量安排上~
好的,愿望已收到。后续争取尽量安排上~
回复回复点赞举报
不知道这个中奖后站内信有无通知呀
不知道这个中奖后站内信有无通知呀
11点赞举报
有的,每个月中上旬会在“文档活动中心”公布获奖名单,请您关注。也会有站内信和短信通知的哈~
有的,每个月中上旬会在“文档活动中心”公布获奖名单,请您关注。也会有站内信和短信通知的哈~
回复回复点赞举报
6,7月份中奖名单来啦,问题多多,礼物多多
6,7月份中奖名单来啦,问题多多,礼物多多
回复回复点赞举报
加载更多
推荐阅读
编辑精选文章
换一批
【你找茬儿,我发奖】腾讯云 API 文档“捉虫”活动
登录腾讯云官网,进入 API 中心,选择感兴趣的产品,参照 API 文档指引进行实操测试。
腾讯云文档
2020/05/20
15.8K25
【你找茬儿,我发奖】腾讯云 API 文档“捉虫”活动
腾讯云计算产品文档捉虫大赛
为了提升广大用户的文档的使用体验,现推出计算产品文档捉虫大赛。邀请大家对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2023/03/21
8.4K0
腾讯云计算产品文档捉虫大赛
【数据库】产品文档定向捉虫活动
为了提升广大用户的文档使用体验,现推出【数据库】产品文档定向捉虫活动。邀请您对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2024/09/03
8520
【数据库】产品文档定向捉虫活动
【网络 & CDN与边缘】产品文档定向捉虫活动
为了提升广大用户的文档使用体验,现推出【网络 & CDN与边缘】产品文档定向捉虫活动。邀请您对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2024/10/08
5960
【网络 & CDN与边缘】产品文档定向捉虫活动
数据库产品文档定向捉虫活动
为了提升广大用户的文档的使用体验,现推出数据库产品文档捉虫大赛。邀请大家对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2023/06/02
2.9K0
数据库产品文档定向捉虫活动
【安全】产品文档捉虫活动
为了提升广大用户的文档的使用体验,现推出【安全】产品文档定向捉虫活动。邀请大家对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2023/12/05
8710
【安全】产品文档捉虫活动
【办公协同 & 微信生态 & 物联网】产品文档捉虫活动
为了提升广大用户的文档的使用体验,现推出【办公协同 & 微信生态 & 物联网】产品文档定向捉虫活动。邀请大家对指定产品文档进行体验,反馈文档问题就有机会获得腾讯云电子代金券、京东储值卡和神秘好礼!发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2024/04/09
5440
【办公协同 & 微信生态 & 物联网】产品文档捉虫活动
【TDP加码福利】文档有奖反馈活动
1、提交问题后,一般在2-3个工作日会收到评估结果通知,参与人多反馈量大时会视情况顺延,具体以实际为准。可从腾讯云站内信及腾讯云助手微信公众号查看消息通知;
TDP 官方运营
2022/07/06
1.8K2
【TDP加码福利】文档有奖反馈活动
【你找茬儿,我发奖】腾讯云产品文档“捉虫”活动
为了提升广大用户的文档的使用体验,现推出产品文档“捉虫”活动。邀请大家对指定产品文档进行体验,提交问题即可赢取积分奖励,更有机会获得腾讯云电子代金券和精美奖品 ! 发现和反馈的文档问题价值越高,奖品越丰厚。
腾讯云文档
2022/06/02
1.7K0
【你找茬儿,我发奖】腾讯云产品文档“捉虫”活动
【有奖征集】GPU云服务器用户实践征文
特别声明:腾讯云有权根据自身运营安排,自主决定和调整本活动的具体规则,具体活动规则以活动页公布规则为准。相关规则一经公布即产生效力,您应当予以遵守。
腾讯云文档
2022/03/31
5K9
【有奖征集】GPU云服务器用户实践征文
高性能计算平台 THPC 用户实践征文
2. 投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格。
腾讯云文档
2022/10/13
3.3K1
高性能计算平台 THPC 用户实践征文
【有奖征文】网站备案用户实践征文
2. 投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格。
腾讯云文档
2023/04/03
4.1K5
【有奖征文】网站备案用户实践征文
腾讯云 AI 绘画有奖征文大赛
API(AI 绘画)用户接入后默认提供文生图、图生图各50次免费调用资源包,并为活动参与用户提供最低2折优惠;SaaS 版(腾讯云智能图像创作平台)在线创作平台新账号提供10张免费生成额度,并为活动参与用户提供最低2.7折套餐优惠。
腾讯云文档
2023/12/05
6200
腾讯云 AI 绘画有奖征文大赛
【玩转OCR有奖征文】腾讯云文字识别用户实践征文来了!
文字识别是最具有落地应用价值的AI技术之一,已逐渐“下沉”为一项基本的能力,为上层不同的业务应用提供底层技术支撑。
腾讯云AI
2023/07/20
3.7K8
【玩转OCR有奖征文】腾讯云文字识别用户实践征文来了!
看过来~腾讯云AI用户实践有奖奖奖征稿啦!
@参考范文 1/最佳实践|用腾讯云AI文字识别实现企业资质证书识别 2/最佳实践 | 用腾讯云AI语音识别零基础实现小程序语音输入法 3/最佳实践 | 用腾讯云AI意愿核身为电话合规保驾护航 4/最佳实践 | 用腾讯云AI文字识别从0到1实现通信行程卡识别 5/最佳实践 | 用腾讯云AI人脸融合实现云毕业照推广活动小程序 @投稿说明 1. 文章要求发布在腾讯云开发者社区; 2. 投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格; 3. 投稿内容字数不少于400
腾讯云AI
2022/09/19
4.1K0
看过来~腾讯云AI用户实践有奖奖奖征稿啦!
【COS 加码福利】COS 用户实践有奖征文,等你来投稿!
COS用户实践征文活动火热进行中,本次征集主题为:如何在生态场景下使用 COS? 优质文章将有机会被编入腾讯云官方文档库,供广大用户学习参考。更有多重好礼等你来拿,速来围观投稿吧! 投稿说明 1、投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格。 2、文章要求发布在腾讯云开发者社区。 3、投稿内容字数不少于400字,要求文字顺通、图片清晰、代码规范。 4、投稿内容一经采用,将会被纳入官方产品文档,腾讯云拥有使用权,可对文稿进行编辑和分享。 5、活动最终解释权归腾讯
云存储
2022/08/26
1.6K0
【COS 加码福利】COS 用户实践有奖征文,等你来投稿!
AI 专题用户实践征文
2. 投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格。
腾讯云文档
2022/09/15
1.4K1
AI 专题用户实践征文
【有奖征文】网站备案 用户实践征文
2. 投稿内容必须保证内容原创性,实践过程真实、内容代码化,一经发现侵权行为,取消活动参与资格。
TDP 官方运营
2023/03/31
9100
【有奖征文】网站备案 用户实践征文
DNS 解析用户实践征文
(2) 投稿内容为腾讯云 DNSPod 解析产品的技术开发实践、场景应用,需要使用到腾讯云 DNSPod 的至少一个解析产品,包括 DNS 解析、Public DNS 公共解析、HTTPDNS 移动解析、Private DNS 私有域解析。
腾讯云文档
2022/05/19
2.2K14
DNS 解析用户实践征文
CDN 用户实践征文
**特别声明**:腾讯云有权根据自身运营安排,自主决定和调整本活动的具体规则,具体活动规则以活动页公布规则为准。相关规则一经公布即产生效力,您应当予以遵守。
腾讯云文档
2022/06/01
1.9K12
CDN 用户实践征文
推荐阅读
相关推荐
【你找茬儿,我发奖】腾讯云 API 文档“捉虫”活动
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验