在调研gin作为网关的可用性 我想针对其他服务返回的response,再裹一层json规范 例如: { "success":true "data": #其他response }

针对这种场景是使用了网上搜索的方式,添加一个 gin.HandlerFunc 中间,临时保存了 write 数据。但是看起来很简陋,不严谨。

请问有其他更加优雅的方式么

Comment From: zhangzhenpeng

加一个插件这种还容易出错 要控制异常返回,否则容易把一些错误状态弄丢。 可以直接封装一个 warp fun 把ctx.Json 封装一层 , ctx.Json 换成 warp.RspWarp(ctx, status, gin.H)

Comment From: yanyin1986

最近实践的感觉是,自定义一个 render.Render,内部去调用 render.JSON{} 再进一步 Render的方法比较优雅。

例如

type MyRender struct {
    Error *MyError
        Data *gin.H
}

// Render implements the render.Render interface
func (r MyRender) Render(w http.ResponseWriter) error {
        if r.Error != nil {
        return render.JSON{Data: gin.H{
            "success": false,
            "data":    r.Data,
        }}.Render(w)
    } else {
        // If no error, we still return a success response
        return render.JSON{Data: gin.H{
            "success": true,
            "data":    r.Data,
        }}.Render(w)
    }
}

// WriteContentType implements render.Render interface
func (r MyRender) WriteContentType(w http.ResponseWriter) {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
}

使用的时候


func a(c *gin.Context) {
        c.Render(http.StatusOK, MyRender {})
}

Comment From: appleboy

It is not the gin issue.