在使用Gin开发web应用的时候,业务异常是很常见的,通常我们会为每个异常情况定义一个唯一的error。同时当发生异常的时候,我们也需要把异常信息放入到接口的响应信息里面,方便页面上做提示。
//业务异常package bizerrconst ( // 定义可预见的异常 UserNotFound = 10001 PasswrodErr = 10002)var resultCodeText = map[int]string{ UserNotFound: "用户不存在",}func Message(code int) (string, bool) { message, ok := resultCodeText[code] return message, ok}
错误码这里有5位
1 | 01 | 01 |
错误级别,如服务级 | 模块级,如用户模块 | 具体的错误码,如用户名错误 |
为了让这些错误信息以及正常情况的返回数据都有统一的结构来管理,我们需要先定义一个统一返回的数据结构体。
要想实现统一的异常处理,我们需要借助Gin提供的中间件功能去在返回数据之前,拦截到出现的错误,在这里重新包装成我们定义的统一结构体。
package middlewareimport ( "net/http" "github.com/gin-gonic/gin")// Result 表示统一响应的JSON格式type Result struct { Code int `json:"code"` // 状态码 Message string `json:"message"` // 响应消息 Data interface{} `json:"data"` // 响应数据}
接下来我们要给 Result 提供几个常用的方法,比如出现异常时候需要调用的方法,正常情况下需要调用的方法。
func Fail(c *gin.Context, code int, message string) { c.JSON(code, Result{ Code: code, Message: message, Data: nil, }) c.Abort()} //异常信息从定义好的bizerr里面获取 func Fail(c *gin.Context, code int) { message, _ := bizerr.StatusText(code) c.JSON(code, Result{ Code: code, Message: message, Data: nil, }) c.Abort()}//ok 不需要返回数据 datafunc Ok(c *gin.Context, code int) { c.JSON(code, Result{ Code: code, Message: message, Data: nil, })}//接口执行正常 需要返回数据 datafunc Ok(c *gin.Context, code int, message string, data interface{} ) { c.JSON(code, Result{ Code: code, Message: message, Data: data, })}//接口执行正常 需要返回数据 datafunc Ok(c *gin.Context, code int, data interface{} ) { c.JSON(code, Result{ Code: code, Message: "ok", Data: data, })}
实现拦截返回结果的中间件
func GlobalErrorMiddleware() gin.HandlerFunc { return func(c *gin.Context) { //先执行请求 c.Next() // 发生了错误 if len(c.Errors) > 0 { //获取最后一个error 返回 err := c.Errors.Last() Fail(c, http.StatusInternalServerError, err.Error()) return } }}
使用中间件
func main() { r := gin.New() r.Use(middleware.GlobalErrorMiddleware()) r.GET("/test2", func(c *gin.Context) { m := map[string]interface{}{ "lang": "go", } data:=Result{ Data: m, } middleawre.Ok(http.Status.OK,data) }) r.Run(":8080")}
使用postman 返回
图片
由此,我们看到了Gin提供的中间件的威力,中间件可以帮助我们做很多中间的事情。
通过定义统一的返回结构,使得我们的所有接口都可以以相同的数据结构展示给需要调用接口的人。大大提高了代码的可读性和维护性。
本文链接:http://www.28at.com/showinfo-26-34899-0.htmlGin 实现统一异常处理和封装统一返回结果
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 使用Python文本分析:数据读取编码错误问题处理
下一篇: 分享一个 Python 处理音频的库