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

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

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

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

byx28资讯网——每日最新资讯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}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

byx28资讯网——每日最新资讯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"`    // 响应数据}

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

接下来我们要给 Result 提供几个常用的方法,比如出现异常时候需要调用的方法,正常情况下需要调用的方法。byx28资讯网——每日最新资讯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,  })}

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

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

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

byx28资讯网——每日最新资讯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    }          }}

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

使用中间件byx28资讯网——每日最新资讯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")}

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top