运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

    • 前言

    • Go基础知识

    • Go基本语法

    • 实战项目:简单web服务

    • 基本数据类型

    • 内置运算符

    • 分支和循环

    • 函数 function

    • 结构体 struct

    • 方法 method

    • 实战项目:跟踪函数调用链

    • 接口 interface

    • 并发 concurrency

    • 指针

    • 实战项目:实现轻量级线程池

    • 实战项目:实现TCP服务器

    • go常用包

    • Gin框架

      • gin入门
      • gin工作流程
      • gin中间件
        • gin路由
        • gin请求
        • 数据绑定和校验
        • 响应返回
        • 路由分发
        • Cookie和Session
        • gin项目结构
        • GORM入门
        • 一对多关联查询
      • go随记

    • Python

    • Shell

    • Java

    • Vue

    • 前端

    • 编程浅尝
    • Go
    • Gin框架
    lyndon
    2022-06-29
    目录

    gin中间件

    # 1. gin中间件

    # 1.1 中间件介绍

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

    # 1.2 全局中间件

    • 所有请求都经过此中间件
    • 中间件中没有调用next方法,先走完中间件才会执行视图函数
    package main
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"time"
    )
    
    // 定义中间
    func MiddleWare() gin.HandlerFunc {
    	return func(c *gin.Context) {
    		t := time.Now()
    		fmt.Println("中间件开始执行了")
    		// 设置变量到Context的key中,可以通过Get()取
    		c.Set("request", "中间件")
    		status := c.Writer.Status() // 获取状态码
    		t2 := time.Since(t)
    		fmt.Println("中间件执行完毕", t2, status)
    
    	}
    }
    
    func main() {
    	// 1.创建路由
    	// 默认使用了2个中间件Logger(), Recovery()
    	r := gin.Default()
    	// 注册中间件
    	r.Use(MiddleWare())
    	// {}为了代码规范
    	{
    		r.GET("/ce", func(c *gin.Context) {
    			// 取值
    			req, _ := c.Get("request")
    			fmt.Println("################### next() 跳转到 这里执行")
    			fmt.Println("request:", req)
    			// 页面接收
    			c.JSON(200, gin.H{"request": req})
    		})
    
    	}
    	r.Run()
    }
    /*
    中间件开始执行了
    中间件执行完毕 0s 200
    ################### next() 跳转到 这里执行
    request: 中间件
     */
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    # 1.2 Next()方法

    • 在中间件中调用 next() 方法,会从next()方法调用的地方跳转到视图函数
    • 视图函数执行完成再调用next() 方法
    package main
    
    import (
    	"fmt"
    	"time"
    	"github.com/gin-gonic/gin"
    )
    
    // 定义中间
    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() {
    	// 1.创建路由
    	// 默认使用了2个中间件Logger(), Recovery()
    	r := gin.Default()
    	// 注册中间件
    	r.Use(MiddleWare())
    	// {}为了代码规范
    	{
    		r.GET("/ce", func(c *gin.Context) {
    			// 取值:中间件中设置的值可以取出
    			req, _ := c.Get("request")
    			fmt.Println("################### next() 跳转到 这里执行")
    			fmt.Println("request:", req)
    			// 页面接收
    			c.JSON(200, gin.H{"request": req})
    		})
    
    	}
    	r.Run()
    }
    
    /*
    中间件开始执行了
    ################### next() 跳转到 这里执行
    request: 中间件
    中间件执行完毕 200
    time: 0s
    */
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

    # 1.3 局部中间件

    • 局部中间件只会在局部执行
    package main
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"time"
    )
    
    // 定义中间
    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() {
    	// 1.创建路由
    	// 默认使用了2个中间件Logger(), Recovery()
    	r := gin.Default()
    	//局部中间键使用
    	r.GET("/ce", MiddleWare(), func(c *gin.Context) {
    		// 取值
    		req, _ := c.Get("request")
    		fmt.Println("################### next() 跳转到 这里执行")
    		fmt.Println("request:", req)
    		// 页面接收
    		c.JSON(200, gin.H{"request": req})
    	})
    	r.Run()
    }
    /*
    中间件开始执行了
    ################### next() 跳转到 这里执行
    request: 中间件
    中间件执行完毕 200
    time: 0s
    */
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    # 1.4 路由组注册中间件

    • 写法1:
    shopGroup := r.Group("/shop", StatCost())
    {
        shopGroup.GET("/index", func(c *gin.Context) {...})
        ...
    }
    
    1
    2
    3
    4
    5
    • 写法2:
    shopGroup := r.Group("/shop")
    shopGroup.Use(StatCost())
    {
        shopGroup.GET("/index", func(c *gin.Context) {...})
        ...
    }
    
    1
    2
    3
    4
    5
    6

    # 2.中间件练习

    • 定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间
    package main
    import (
        "fmt"
        "time"
        "github.com/gin-gonic/gin"
    )
    
    // 定义中间
    func myTime(c *gin.Context) {
        start := time.Now()
        c.Next()
        // 统计时间
        since := time.Since(start)
        fmt.Println("程序用时:", since)
    }
    
    func main() {
        // 1.创建路由
        // 默认使用了2个中间件Logger(), Recovery()
        r := gin.Default()
        // 注册中间件
        r.Use(myTime)
        // {}为了代码规范
        shoppingGroup := r.Group("/shopping")
        {
            shoppingGroup.GET("/index", shopIndexHandler)
            shoppingGroup.GET("/home", shopHomeHandler)
        }
        r.Run(":8000")
    }
    
    func shopIndexHandler(c *gin.Context) {
        time.Sleep(5 * time.Second)
    }
    
    func shopHomeHandler(c *gin.Context) {
        time.Sleep(3 * time.Second)
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    • 效果演示

    img

    上次更新: 2022/06/29, 00:08:43
    gin工作流程
    gin路由

    ← gin工作流程 gin路由→

    最近更新
    01
    ctr和crictl显示镜像不一致
    03-13
    02
    alpine镜像集成常用数据库客户端
    03-13
    03
    create-cluster
    02-26
    更多文章>
    Theme by Vdoing | Copyright © 2015-2024 op81.com
    苏ICP备18041258号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式