当前位置:首页 > 科技  > 软件

Gin 实现统一异常处理和封装统一返回结果

来源: 责编: 时间:2023-11-28 17:11:04 315观看
导读在使用Gin开发web应用的时候,业务异常是很常见的,通常我们会为每个异常情况定义一个唯一的error。同时当发生异常的时候,我们也需要把异常信息放入到接口的响应信息里面,方便页面上做提示。//业务异常package bizerrconst

在使用Gin开发web应用的时候,业务异常是很常见的,通常我们会为每个异常情况定义一个唯一的error。同时当发生异常的时候,我们也需要把异常信息放入到接口的响应信息里面,方便页面上做提示。qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

//业务异常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}

qa228资讯网——每日最新资讯28at.com

错误码这里有5位 qa228资讯网——每日最新资讯28at.com

1
qa228资讯网——每日最新资讯28at.com

01
qa228资讯网——每日最新资讯28at.com

01
qa228资讯网——每日最新资讯28at.com

错误级别,如服务级
qa228资讯网——每日最新资讯28at.com

模块级,如用户模块
qa228资讯网——每日最新资讯28at.com

具体的错误码,如用户名错误
qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

  • 错误级别:服务级错误用1,普通错误用2,通常是用户的非法操作      
  • 模块级错误码:2 位数进行表示,比如 01 为用户模块;02 为订单模块  
  • 具体错误码:2 位数进行表示,比如 01 为手机号不合法;02 为密码输入错误

qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

为了让这些错误信息以及正常情况的返回数据都有统一的结构来管理,我们需要先定义一个统一返回的数据结构体。qa228资讯网——每日最新资讯28at.com

要想实现统一的异常处理,我们需要借助Gin提供的中间件功能去在返回数据之前,拦截到出现的错误,在这里重新包装成我们定义的统一结构体。qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

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"`    // 响应数据}

qa228资讯网——每日最新资讯28at.com

接下来我们要给 Result 提供几个常用的方法,比如出现异常时候需要调用的方法,正常情况下需要调用的方法。qa228资讯网——每日最新资讯28at.com

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

qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

实现拦截返回结果的中间件qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

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

qa228资讯网——每日最新资讯28at.com

使用中间件qa228资讯网——每日最新资讯28at.com

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

qa228资讯网——每日最新资讯28at.com

使用postman 返回qa228资讯网——每日最新资讯28at.com

图片图片qa228资讯网——每日最新资讯28at.com

qa228资讯网——每日最新资讯28at.com

由此,我们看到了Gin提供的中间件的威力,中间件可以帮助我们做很多中间的事情。qa228资讯网——每日最新资讯28at.com

通过定义统一的返回结构,使得我们的所有接口都可以以相同的数据结构展示给需要调用接口的人。大大提高了代码的可读性和维护性。qa228资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34899-0.htmlGin 实现统一异常处理和封装统一返回结果

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Python文本分析:数据读取编码错误问题处理

下一篇: 分享一个 Python 处理音频的库

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top