基础环境
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)
}
}
入口函数调用
中间件函数写完之后的操作
- 入口函数注册中间件
- 入口函数声明调用函数需要的路由及中间件
- 中间件函数执行 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":"计时中间件"}