中间件

Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

通俗的讲:中间件就是匹配路由前和匹配路由完成后执行的一系列操作

路由中间件

Gin 中的中间件必须是一个 gin.HandlerFunc 类型,配置路由的时候可以传递多个 func 回调函数,最后一个 func 回调函数前面触发的方法都可以称为中间件

// 请求方式的源码参数,... 可以传入多个func(context *gin.Context)
// 可以在func(context *gin.Context)之前传入自定义的一些处理方法
(relativePath string, handlers ...HandlerFunc)
定义和使用路由中间件
写法一
// 定义一个中间件要执行的方法
func MiddlewareFunc() {
fmt.Println("中间件方法") } func ApiRoutersInit(router *gin.Engine) { apiRouter := router.Group("api")
{
apiRouter.GET("list",
func(context *gin.Context) {
// 请求前执行中间件方法
MiddlewareFunc()
},
// 执行请求
func(context *gin.Context) {
context.String(http.StatusOK, "ok") }) }
}
写法二
// 定义一个中间件要执行的方法
func MiddlewareFunc(context *gin.Context) {
fmt.Println("中间件方法") } func ApiRoutersInit(router *gin.Engine) { apiRouter := router.Group("api")
{
// 写法二
apiRouter.GET("list", MiddlewareFunc,func(context *gin.Context) {
context.String(http.StatusOK, "ok") }) }
}
ctx.Next()

中间件里面加上 ctx.Next()可以让我们在路由匹配完成后执行一些操作

func MiddlewareFunc(context *gin.Context) {

	fmt.Println("请求执行前")
// 调用该请求的剩余处理程序
context.Next()
// 执行后面的func(context *gin.Context)方法
// 每调用一次 context.Next() ,向后执行一个func(context *gin.Context) // 执行完之后再执行打印
fmt.Println("请求执行完成") }
ctx.Abort

Abort 是终止的意思, ctx.Abort() 表示终止调用该请求的剩余处理程序

func MiddlewareFunc(context *gin.Context) {
fmt.Println("aaa")
// 终止该请求的剩余处理程序
context.Abort()
fmt.Println("这里继续打印") }

全局中间件

func main() {
router := gin.Default() // 在匹配路由之前配置全局中间件 // 使用Use配置全局中间件,参数就是中间件方法,可以传入多个,
router.Use(MiddlewareFunc1,MiddlewareFunc2) router.GET("/", func(context *gin.Context) {
context.String(http.StatusOK, "ok") }) // 将默认引擎传给其他文件定义的接收引擎的方法
api.ApiRoutersInit(router)
router.Run() }

路由分组中间件

方法一
func ApiRoutersInit(router *gin.Engine) {
// 在路由分组的Group后配置中间件
apiRouter := router.Group("api",MiddlewareFunc)
{
apiRouter.GET("list",
// 执行请求
func(context *gin.Context) {
context.String(http.StatusOK, "ok") }) }
}
方法二
func ApiRoutersInit(router *gin.Engine) {
apiRouter := router.Group("api")
// 调用group对象 配置中间件
apiRouter.Use(MiddlewareFunc)
{
apiRouter.GET("list",
// 执行请求
func(context *gin.Context) {
context.String(http.StatusOK, "ok") }) }
}

中间件和对应控制器共享数据

// 中间件

func MiddlewareFunc(context *gin.Context) {
// 通过Set设置一个数据 k,v
context.Set("name", "li") }
// 控制器
func (a ApiController) ApiSetInfo(context *gin.Context) {
// 通过.Get(key) 获取值,获取到的是一个any类型的值和是否异常的bool
username, _ := context.Get("name")
// 通过类型断言获取string类型的name
name, _ := username.(string)
context.String(http.StatusOK, name)
}

中间件注意事项

gin默认中间件

gin.Default()默认使用了 Logger 和 Recovery 中间件,其中:

• Logger 中间件将日志写入 gin.DefaultWriter,即使配置了 GIN_MODE=release。

• Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码。

如果不想使用上面两个默认的中间件,可以使用 gin.New()新建一个没有任何默认中间件的路由

中间件中使用协程

当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context),必须使用其只读副本(c.Copy())

func MiddlewareFunc(context *gin.Context) {
c := context.Copy() go func() {
fmt.Println("url是", c.Request.URL)
}() go func() {
fmt.Println("body是", c.Request.Body)
}() }
// 不需要wait等待协程完成,因为主程序main.go会一直执行

gin中间件&控制器的更多相关文章

  1. 【Gin-API系列】Gin中间件之日志模块(四)

    日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...

  2. 【Gin-API系列】Gin中间件之异常处理(六)

    本文我们介绍生产环境上如何通过捕捉异常recovery来完善程序设计和提高用户体验. Golang异常处理 golang 的异常处理比较简单,通常都是在程序遇到异常崩溃panic之后通过defer调用 ...

  3. gin中间件推荐

    中间件推荐 1.1.1. 列表 谷歌翻译欢迎查看原文 https://github.com/gin-gonic/contrib/blob/master/README.md RestGate - RES ...

  4. golang程序设计:Go middleware中间件以及Gin 中间件分析

    先从业务开发角度出发,来逐渐引出中间件. 一.刚开始时业务开发 开始业务开发时,业务需求比较少. 当我们最开始进行业务开发时,需求不是很多. 第一个需求产是品向大家打声招呼:"hello w ...

  5. 【Gin-API系列】Gin中间件之鉴权访问(五)

    在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...

  6. 难道这就是gin中间件的原理,一个装饰者模式而已?

    func wrapCtx(handler func(ctx *gin.Context)) gin.HandlerFunc { return func(c *gin.Context) { //获取请求的 ...

  7. Gin中间件middleware

    类型 全局中间件 单个路由中间件 群组中间件 Reference

  8. 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)

    数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...

  9. 基于gin的golang web开发:中间件

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

  10. gin框架中中间件的编写与使用

    概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...

随机推荐

  1. 【转帖】8.JVM双亲委派机制(面试常问)

    目录 1.什么是双亲委派机制? 2.双亲委派机制的优势 3.沙箱安全机制 1.什么是双亲委派机制? 双亲委派机制工作原理:(面试) 1.如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这 ...

  2. [转帖]一行Python代码实现同一局域网内的文件共享

    在不同的设备之间传输文件除了数据线,网盘传输外是否还有其他优雅的方法?我们可以使用一行Python代码使局域网内的所有设备都可以访问并下载文件夹内的文件. 要求: 电脑中安装配置好python 访问的 ...

  3. [转帖]Intel甘拜下风,挤牙膏比不过兆芯CPU

      https://baijiahao.baidu.com/s?id=1735997557665412214 本文比较长,有万字左右,因此在前面先把小标题集中亮个相. 即使大家一晃而过,我也要让精心拟 ...

  4. PG数据库恢复简单记录

    公司同事给了一个很小的数据 我这边进行备份和恢复操作 第一步 创建数据库 su - postgres #进入pg数据库的用户 psql #输入密码 登录 create user demo with p ...

  5. 飞腾2000+银河麒麟v10安装redis的注意事项

    先说一下结论 无法复用ubuntu上面编译的二进制文件 无法直接使用docker官网下面的arm64的镜像运行 无法直接使用redis6.0.10最新版本编译运行 可以使用redis5.0.4 进行编 ...

  6. js 保留两位小数不进行四舍五入

    保留两位小数不进行四舍五入 // 保留小数n位,不进行四舍五入 // num你传递过来的数字, // decimal你保留的几位,默认保留小数后两位 app.config.globalProperti ...

  7. Typescript中存取器getters和setters的使用

    1.存取器 存取器可以让我们可以有效的控制对,对象中的中的成员的访问. 可以通过getters和setters来进行操作 在typescript中分别对应 get 和 set 2.如何解决报错 typ ...

  8. 图片三像素问题如何解决css

    一.提出问题 在浏览器中,图片有一个下间隙问题,有人也称之为图片3像素BUG 1.这并不是什么浏览器bug,而只是英文字母书写时有个基线的问题,基线决定了图片的对其方式.这才是造成浏览器中图片下间隙的 ...

  9. Python 潮流周刊第 19 期摘要

    原文全文:https://pythoncat.top/posts/2023-09-09-weekly 文章&教程 1.Mojo 终于提供下载了! 2.我们能从 PEP-703 中学到什么? 3 ...

  10. .net web发布至阿里云服务器

    1.发 布网站第一步:右键网站主项目,选择 发布网站.如下图 第二步 填写发布网站的相关配置,选择配置文件,新建配置文件 第三步 选择发布的文件存放的位置 第四步,选择Release 再点击下一步,点 ...