问题描述
给出:
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"})
}
}