微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何包装路由处理函数gin.HandlerFunc

如何解决如何包装路由处理函数gin.HandlerFunc

给出:

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 ...解决此问题的最佳方法是什么?

解决方法

谢谢您的建议,它对您有帮助:-)正确的包装器功能是:

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"})
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。