gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:10:37 29 4
gpt4 key购买 nike

给定:

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

关于go - 如何包装路由处理函数 gin.HandlerFunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63968197/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com