中间件

  • 分类使用方式
  1. // 1.全局中间件
  2. router.Use(gin.Logger())
  3. router.Use(gin.Recovery())
  4. // 2.单路由的中间件,可以加任意多个
  5. router.GET("/benchmark", MyMiddelware(), benchEndpoint)
  6. // 3.群组路由的中间件
  7. authorized := router.Group("/", MyMiddelware())
  8. // 或者这样用:
  9. authorized := router.Group("/")
  10. authorized.Use(MyMiddelware())
  11. {
  12. authorized.POST("/login", loginEndpoint)
  13. }

  • 自定义中间件
  1. //定义
  2. func Logger() gin.HandlerFunc {
  3. return func(c *gin.Context) {
  4. t := time.Now()
  5. // 在gin上下文中定义变量
  6. c.Set("example", "12345")
  7. // 请求前
  8. c.Next()//处理请求
  9. // 请求后
  10. latency := time.Since(t)
  11. log.Print(latency)
  12. // access the status we are sending
  13. status := c.Writer.Status()
  14. log.Println(status)
  15. }
  16. }
  17. //使用
  18. func main() {
  19. r := gin.New()
  20. r.Use(Logger())
  21. r.GET("/test", func(c *gin.Context) {
  22. //获取gin上下文中的变量
  23. example := c.MustGet("example").(string)
  24. // 会打印: "12345"
  25. log.Println(example)
  26. })
  27. // 监听运行于 0.0.0.0:8080
  28. r.Run(":8080")
  29. }

  • 中间件参数

  • 内置中间件
    1.简单认证BasicAuth

  1. // 模拟私有数据
  2. var secrets = gin.H{
  3. "foo": gin.H{"email": "foo@bar.com", "phone": "123433"},
  4. "austin": gin.H{"email": "austin@example.com", "phone": "666"},
  5. "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"},
  6. }
  7. func main() {
  8. r := gin.Default()
  9. // 使用 gin.BasicAuth 中间件,设置授权用户
  10. authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{
  11. "foo": "bar",
  12. "austin": "1234",
  13. "lena": "hello2",
  14. "manu": "4321",
  15. }))
  16. // 定义路由
  17. authorized.GET("/secrets", func(c *gin.Context) {
  18. // 获取提交的用户名(AuthUserKey)
  19. user := c.MustGet(gin.AuthUserKey).(string)
  20. if secret, ok := secrets[user]; ok {
  21. c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret})
  22. } else {
  23. c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("})
  24. }
  25. })
  26. // Listen and serve on 0.0.0.0:8080
  27. r.Run(":8080")
  28. }