在调研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.