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. pytest+allure生成接口自动化测试报告

    准备环境 1.安装pytest pip install pytest -i http://pypi.douban.com/simple pytest-ordering pytest.main([ &q ...

  2. Linux操作系统的基本介绍

    01 操作系统的概述介绍 操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控制输入设备与输出 ...

  3. 【C语言入门学习笔记】如何把C语言程序变成可执行文件!

    环境 在ANSI的任何一种实现中,存在两种不同的环境. 翻译环境:在这个环境里,源代码被转换为可执行的机器指令. 执行环境:用于实际执行代码. 翻译环境 组成一个程序的每个源文件通过编译过程分别转成目 ...

  4. phpstorm 注解路由插件

    idea-php-annotation-plugin 设置 插件 搜索 安装 重启

  5. java调用.net的webservice[转]

    一.引用jar包. 完整包路径:http://files.cnblogs.com/files/chenghu/axis完整jar包.rar 二.java程序代码如下所示: package edu.sj ...

  6. 第十九章 keepalived高可用

    一.keepalived高可用 1.什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的. 2.高可用使用的工具 1 ...

  7. MVC注册

    前言 最近没什么写的,写个MVC注册巩固一下 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head> < ...

  8. 联赛模拟测试24 D. 你相信引力吗 单调栈

    题目描述 分析 因为跨过最大值的区间一定是合法的,所以我们人为地把最大值放在最左边 我们要统计的就是在最大值右边单调不降的序列,可以用单调栈维护 需要特殊处理相同的情况 代码 #include< ...

  9. SpringBoot+Mybatis_Plus Generator

    AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.Control ...

  10. python使用zlib库压缩图片,使用ffmpeg压缩视频

    python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...