gin 中间件 middleware 的编写和使用

726 阅读2分钟

中间件的定义

在一个完整的Web应用服务中,通常包含三个步骤:

  1. 客户端操作
  2. 服务器端处理
  3. 返回处理的结果给客户端

在实际的业务开发和处理中,会有更负责的需求和业务场景。

鉴权认证、权限管理、安全检查、日志记录等这些保障和支持系统业务属于全系统的业务,和具体的系统业务没有关联,对于系统中的所有业务都适用。

由此,在业务开发过程中,为了更好的梳理系统架构,可以将上述描述所涉及的一些通用业务单独抽离并进行开发,然后以插件化的形式进行对接。这种方式既保证了系统功能的完整,同时又有效的将具体业务和系统功能进行解耦,还可以达到灵活配置的目的。

这种通用业务独立开发并灵活配置使用的组件,一般称之为"中间件",因为其位于服务器和实际业务处理程序之间。其含义就是相当于在请求和具体的业务逻辑处理之间增加某些操作,这种以额外添加的方式不会影响编码效率,也不会侵入到框架中。

Gin的中间件

在gin中,中间件称之为 middleware,中间件的类型定义如下

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)

HandlerFunc是一个函数类型,接受一个Context参数。用于编写程序处理函数并返回 HandlerFunc 类型。

自定义中间件

中间件类型是函数,有两条标准:

  1. func 函数
  2. 返回值类型为 HandlerFunc
package main

import (
	"github.com/gin-gonic/gin"
	"fmt"
)

func main(){
    r:=gin.Default()
    //使用中间件(全部使用)
    r.Use(RequestInfos())

                //单独使用中间件
    r.GET("/hello",SayHello(),func(c *gin.Context) {
        c.JSON(200,map[string]interface{}{
            "code":123,
            "msg":"请求Hello",
        })
    })
    r.GET("/query",func(c *gin.Context) {
        c.JSON(200,map[string]interface{}{
            "code":123,
            "msg":"请求query",
        })
    })
    r.Run()
}

//打印请求信息的中间件
func RequestInfos() gin.HandlerFunc{
    return func(c *gin.Context) {
        path:=c.FullPath()
        method:=c.Request.Method
        fmt.Println("请求路径:",path,"请求method:",method)
    }
}

//用于 hello接口 单独使用的中间件
func SayHello() gin.HandlerFunc{
    return func(c *gin.Context) {
        c.Writer.WriteString("Hello")
        
        //context.Next()用于分割中间件的前后执行顺序
        c.Next()
        fmt.Println("请求的状态码:",c.Writer.Status())
    }
}

context.Next

context.Next 用于业务处理之后

context.Next 函数可以把中间件代码的执行顺序一分为二,Next函数调用之前的代码在请求处理之前。当程序运行到 context.Next 时,会中断向下执行,转而先去执行具体的业务逻辑,执行完业务逻辑处理函数之后,程序会再次回到 context.Next 中断处,继续执行中间件后续的代码。