单个路由中间件:
中间件就是处理请求参数的函数, 在相应之前完成
c.Abort:表示终止HTTP请求
c.Next():继续调用下一个中间件,c.Next()前面的内容是响应中间件,后面的是请求中间件
package main
import "github.com/gin-gonic/gin"
func _user(c *gin.Context) {
user := c.Query("dim")
if user != "admin" {
c.Abort()
c.Next()
c.JSON(200, gin.H{
"code": 200,
"msg": "登录成功",
})
}
}
func _admin(c *gin.Context) {
user := c.Query("dim")
if user == "admin" {
// 如果用户名是admin,那么后面的中间件就终止
c.Abort()
c.Next()
// Next后面的会最后执行,先执行没有遇到c.Abort()的所有的c.Next前面的内容,直到遇到c.Abort()或者执行完了,才会去执行c.Next之后的内容
c.JSON(200, gin.H{
"code": 200,
"msg": "欢迎管理员",
})
}
}
func main() {
router := gin.Default()
router.POST("/p1", _user, _admin)
router.Run(":8080")
}
全局注册中间件:
全局中间件是指在应用程序的每个请求处理过程中都会被调用的中间件
使用 router.Use() 全局注册中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func _d1(c *gin.Context) {
fmt.Println("in")
c.Next()
fmt.Println("out")
}
func main() {
router := gin.Default()
router.Use(_d1)
router.GET("/get1", func(c *gin.Context) {
fmt.Println("111111111111111111111")
c.Next()
fmt.Println("2222222222222222222222")
})
router.Run(":80")
}
中间件传参:
使用 c.Set设置传入的内容,c.Get获取传输的内容
如果传递的是结构体这种数据,不能直接 通过 . 获取属性内容,需要使用 接受变量.(结构体类型) 实现数据类型的转换,因为get返回的是一个any类型
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
type User struct {
Name string
Age uint
}
func _demo(c *gin.Context) {
c.Set("user", User{
Name: "DIM",
Age: 20,
})
}
func main() {
router := gin.Default()
router.Use(_demo)
router.GET("/get1", func(c *gin.Context) {
_user, _ := c.Get("user")
// 断言
u, _ := _user.(User)
fmt.Println(u.Age)
fmt.Println(u.Name)
c.JSON(200, u)
})
router.Run(":80")
}