Gin中全局中间件的设计与调用

/ gin / 没有评论 / 5601浏览

基础环境

Gin 框架 + Golang 语言环境 + Vendor包管理

需求

设计一个模块调用计时全局中间件。

中间件被调用,不仅要有stdout,也需要日志内容的落盘,这是日志中间件负责的了。后面说

目录结构

中间件的代码与功能模块是否分开,看个人喜好,我的是在一起的

 mac@adouMBP~/goProject/src/github.com/lijinghuatongxue/GinLearn # tree -L 2
.
├── README.md
├── go.mod
├── go.sum
├── logs
├── main.go
├── mylib         // 中间件lib和功能模块lib 目录
│   ├── json
│   ├── middleware
│   └── upload
├── page
···
├── tem
····
└── vendor
    ├── github.com
    └── vendor.json

14 directories, 18 files

中间件函数

package middlewaredemo

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

func Middlewaredemofunc()gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		fmt.Sprintf("计时中间件开始执行了~")
		c.Set("request", "计时中间件")
		// 执行中间件/函数
		c.Next()
		// 执行完后续的动作
		status := c.Writer.Status()
		fmt.Println("计时中间件执行完毕", status)
		t2 := time.Since(t)
		fmt.Println("用时", t2)
	}
}

入口函数调用

中间件函数写完之后的操作

  1. 入口函数注册中间件
  2. 入口函数声明调用函数需要的路由及中间件
  3. 中间件函数执行 c.Next()
package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/lijinghuatongxue/GinLearn/mylib/json"
	"github.com/lijinghuatongxue/GinLearn/mylib/middleware"
	···
	"log"
	"net/http"
	"time"
)
func main(){

	// 注册中间件
	r.Use(middlewaredemo.Middlewaredemofunc())
{   
      // 全局调用
	r.GET("/middleware", func(c *gin.Context) {
		req, _ :=c.Get("request")
		fmt.Println("request默认值打印:",req)
		time.Sleep(1 * time.Second)
		// 页面接收
		c.JSON(http.StatusOK,gin.H{"request" : req})

	})
}
    // 局部调用
	r.GET("/middleware2", middlewaredemo.Middlewaredemofunc(), func(c *gin.Context) {
		req, _ := c.Get("request")
		fmt.Println("request:", req)
		c.JSON(200, gin.H{"request": req})
	})
	r.Run(":8080")
}

demo

# go run main.go
·····
[GIN-debug] GET    /long_sync                --> main.main.func10 (3 handlers)
[GIN-debug] GET    /middleware               --> main.main.func11 (4 handlers)
[GIN-debug] Listening and serving HTTP on :8080
request默认值打印: 计时中间件
计时中间件执行完毕 200
用时 1.002025273s
[GIN] 2020/02/23 - 17:01:38 | 200 |  1.002040554s |             ::1 | GET      /middleware

 ✘ mac@adouMBP  ~/goProject/src/github.com/lijinghuatongxue  curl http://localhost:8080/middleware
{"request":"计时中间件"}