gin 实践四 中间件(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gin 实践四 中间件(上)相关的知识,希望对你有一定的参考价值。

参考技术A

在写这篇之前需要讲一下之前几篇中的注意点
一. 包的引入:因为现在还在本地开发,所以所有的本地包引入都以本地路径的方式例如

等后期上传到平台之后统一修改

二. 前面可能有没有讲明白的地方,后期会出一篇完整版,将所有的串联起来出一篇文章
三. 规划,编写的目的是实现一个以 gin 为基础的脚手架

painc 是一个内建函数,可以中断原有的控制流程,进入一个“恐慌”的流程(就是意思我遇到问题了,不知道该咋办,我好慌),这个过程称为错误处理流程。如果处理不好可能导致系统崩溃,服务重启等严重问题。
现在我们就来编写一个简易的捕获异常的中间件,来处理当系统遇到 painc 时合理的处理,并且返回明确的提示。
routers/middleware 文件夹下新建文件 recovery.go

修改 router.go 文件,引入刚刚写的中间件

简单测试一下随便修改之前的一个接口,然后访问

在没有引入中间件时,将会出现以下情况,前端没有返回,后台报错

引入中间件后,前端获取到了信息,后端也正常

GIn_中间件

  • gin可以构建中间件,但它只对注册过的路由函数起作用

  • 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围

  • 中间件分为全局中间件,单个路由中间件和群组中间件

  • gin中间件必须是一个 gin.HandlerFunc 类型

 1. 全局中间件

所有请求都会经过的中间件

package main

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

// 定义中间
func MiddleWare() gin.HandlerFunc {
   return func(c *gin.Context) {
      t := time.Now()
      fmt.Println("中间件开始执行了")
      // 设置变量到Context的key中,可以通过Get()取
      c.Set("request", "中间件")
      // 执行函数
      c.Next()
      // 中间件执行完后续的一些事情
      status := c.Writer.Status()
      fmt.Println("中间件执行完毕", status)
      t2 := time.Since(t)
      fmt.Println("time:", t2)
   }
}

func main() {
   // 创建路由 
   r := gin.Default()
   // 注册中间件
   r.Use(MiddleWare())
   // {}为了代码规范
   {
      r.GET("/middleware", func(c *gin.Context) {
         // 取值
         req, _ := c.Get("request")
         fmt.Println("request:", req)
         // 页面接收
         c.JSON(200, gin.H{"request": req})
      })

   }
   r.Run(":8000")
}

技术图片

1.1 next方法

技术图片

2. 局部中间件

技术图片

 

以上是关于gin 实践四 中间件(上)的主要内容,如果未能解决你的问题,请参考以下文章

登录实现方案与实践

gin-jwt对API进行权限控制

GIn_中间件

golang gin 中常用中间件

Gin框架系列之中间件

Gin简单明了的教程---下