【问题标题】:How to wrap route handler function gin.HandlerFunc如何包装路由处理函数 gin.HandlerFunc
【发布时间】:2020-09-19 20:38:16
【问题描述】:

给定:

package main

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

func main() {
    r := gin.Default()
    r.POST("/status", handler)
    r.Run(":8080")
}

func handler(c *gin.Context) {

    var status string
    if err := c.ShouldBindJSON(&status); err != nil {
        c.JSON(503, gin.H{"status": "failed"})
    }
    c.JSON(200, gin.H{"status": "OK"})
}

处理函数返回错误消息取决于它应该做什么,因为我有很多带有重复错误处理代码的函数来产生错误响应。

如何包装此处理程序以外部化错误处理和响应格式。例如:

package main

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

func main() {
    r := gin.Default()
    r.POST("/status", wrapper(handler_status))
    r.GET("/health", wrapper(handler_health))
    r.Run(":8080")
}

func wrapper(f func(c *gin.Context) (string, error)) gin.HandlerFunc {

    status, err := f()

    if err != nil {
        c.JSON(503, gin.H{"status": err})
        return
    }
    c.JSON(200, gin.H{"status": "OK"})
}

func handler_status(c *gin.Context) (string, error) {

    var status string
    if err := c.ShouldBindJSON(&status); err != nil {
        return "failed", err
    }
    return status, nil
}

func handler_health(c *gin.Context) (string, error) {

    return "roger", nil
}

但我无法访问 wrapper() 中的 *gin.Context ...解决此问题的最佳方法是什么?

【问题讨论】:

  • 在您的wrapper 中,您实际上忘记了返回HandlerFunc。像这样的东西:play.golang.org/p/IkE9i3OaYnx
  • 整个概念被称为中间件。您可以在路由中放置多个处理函数,例如 r.GET("/myEndpoint", middleware1, middleware2, handler) 和中间件 1 和中间件 2 内,您可以执行 c.Next() 以在当前中间件中“冻结”并跳转到下一个等等。你可以在这里阅读更多内容github.com/gin-gonic/gin#using-middleware

标签: go go-gin


【解决方案1】:

感谢您的建议,帮助:-) 正确的包装函数是:

func wrapper(f func(c *gin.Context) (string, error)) gin.HandlerFunc {

    return func(c *gin.Context) {
        _, err := f(c)
        if err != nil {
            c.JSON(503, gin.H{"status": err})
            return
        }
        c.JSON(200, gin.H{"status": "OK"})
    }
}

【讨论】:

猜你喜欢
  • 2016-10-10
  • 2020-05-17
  • 2013-08-27
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多