gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑。实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等。

使用中间件

gin的中间件分为三类:全局中间件、路由中间件、分组路由中间件。

全局中间件:注册全局中间件之后注册的路由才会生效,如果有一些不希望使用全局中间件的路由规则,注册路由代码要放在注册全局中间件之前。

路由中间件:在注册路由时传入的中间件,只对当前路由规则生效。

分组路由中间件:在分组路由中注册,对当前组下的全部路由生效。

func main() {
r := gin.New() r.Use(gin.Logger()) r.GET("/benchmark", MyBenchLogger(), benchEndpoint) authorized := r.Group("/")
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
} r.Run(":8080")
}

以上代码展示了中间件的注册方式。r.Use(gin.Logger())为全局中间件,这里使用的是gin提供的Logger中间件。r.GET("/benchmark", MyBenchLogger(), benchEndpoint)使用了MyBenchLogger中间件,只有在访问/benchmark时生效。authorized.Use(AuthRequired())使用了AuthRequired中间件,在访问/login和/testing/analytics时生效,注意代码中的嵌套路由。

自定义中间件

自定义gin中间件有两种写法。第一种:定义一个方法接收一个*gin.Context类型的参数,和handler的写法是一样的。第二种:定义一个无参的方法,返回值为HandlerFunc类型。代码如下:

// 第一种
func DemoMiddleware(c *gin.Context) {
fmt.Println("DemoMiddleware") c.Next() } // 第二种
func Demo1Middleware() gin.HandlerFunc { return func(c *gin.Context) {
fmt.Println("Demo1Middleware")
c.Next()
}
}

在代码中我们可以看到无论哪种方法定义的中间件都调用了c.Next()将请求传递给请求链中下一个处理方法。中间件中我们还可以调用c.Abort(code)提前结束请求,如下面认证中间件,token参数为空时将不在执行后续的处理方法。

func TokenAuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.Request.Header.Get("token")
if token == "" {
c.Abort()
return
} c.Next()
}
} func main() {
r := gin.Default()
r.GET("/auth", TokenAuthMiddleware(), func(c *gin.Context) {
c.JSON(200, gin.H{"message": "ok"})
})
r.Run(":9999")
}

文章出处:基于gin的golang web开发:中间件

基于gin的golang web开发:中间件的更多相关文章

  1. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

  2. 基于gin的golang web开发:认证利器jwt

    JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...

  3. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

  4. 基于gin的golang web开发:实现用户登录

    前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件.本文将使用这两个包来实现一个简单的用户登录功能. 环境准备 ...

  5. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  6. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  7. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  8. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  9. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

随机推荐

  1. 安装ipython

    安装ipython,首先系统上已安装python 在这里,我们已安装python3 在windows下: pip intsall ipython 在linux下: sudo apt install p ...

  2. Shell Scripting 笔记

    Shell Scripting Tutorial Variables in the Bourne shell do not have to be declared, as they do in lan ...

  3. windows搭建SVN服务

    下载`TortoiseSVN 官网下载址:https://www.visualsvn.com/visualsvn/download/tortoisesvn/ 根据自己系统环境选择 安装Tortoise ...

  4. LinkageSel无限级联动下拉菜单

    http://files.cnblogs.com/files/chenghu/LinkageSel-master.zip

  5. Seaborn系列 | 散点图scatterplot()

    散点图 解读 可以通过调整颜色.大小和样式等参数来显示数据之间的关系. 函数原型 seaborn.scatterplot(x=None, y=None, hue=None, style=None, s ...

  6. mysql explain 查询处理的结果详解

    本文转自 https://blog.csdn.net/boss_way/article/details/91416887 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这 ...

  7. 国内首个 .NET 5 框架 Fur 斩获 1000 stars,1.0.0-rc.final.20 发布

          Fur 是 .NET 5 平台下企业应用开发最佳实践框架. 通往牛逼的路上,风景差得让人只想说脏话,但我在意的是远方. 啥环境 早在 1998 年微软公司对外发布 .NET/C# 平台的那 ...

  8. poj3178 Roping the Field (计算几何 + dp)

    Roping the Field Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 858   Accepted: 250 De ...

  9. Flutter - 自定义Dialog弹窗

    ------------恢复内容开始------------ Flutter - 自定义Dialog弹窗 应用场景:app系统版本升级弹窗,系统退出登录弹窗,首页广告弹窗,消息中心弹窗,删除文件弹窗等 ...

  10. 020_Typora使用

    目录 Typora使用 下载 安装 设置 使用 Typora使用 Typora插入本地图片为本地路径,网络上无法查看,所以建议只插入网络图片. 下载 百度搜索官网 下载 安装 设置 视图->显示 ...