Skip to content

Latest commit

 

History

History
61 lines (47 loc) · 1.22 KB

README.md

File metadata and controls

61 lines (47 loc) · 1.22 KB

wrap gin handler response

gin HandlerFunc 很容易出现忘记return问题:

func(c *gin.Context) {
    var json struct {
    Value string `json:"value" binding:"required"`
    }
    
    if err := c.Bind(&json); err != nil {
        c.String(http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
    }
    
    c.JSON(200, gin.H{
        "message": "pong",
    })
}

可以通过封装一个wrap统一处理响应和错误。附件响应可以不走wrap或者通过解析Metadata处理。

func wrap(f func(c *gin.Context) (interface{}, error)) gin.HandlerFunc {
	return func(c *gin.Context) {
		res, err := f(c)

		// if nil, then return ''
		if res == nil {
			res = ``
		}

		ret := Ret{
			Data: res,
		}
		code := http.StatusOK

		if err != nil {
			e := errors.FromError(err)
			// wrap http status code
			if e.Code > 0 && e.Code <= 600 {
				code = e.Code
			}

			ret.Msg = e.Msg
			ret.Code = e.Code
		}

		c.JSON(code, ret)
	}
}

感谢

How to wrap route handler function gin.HandlerFunc
gin
go-kratos