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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 《英雄联盟》夏季赛总决赛今日开打!JDG对阵LNG首发名单来了 Knight:准备三连冠

    8月5日消息,今日17:00,《英雄联盟》2023LPL夏季赛总决赛将正式开打,由JDG对阵LNG。对两支队伍来说,这场比赛不仅要争夺夏季赛冠军,更要决定谁才是LPL赛区一
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
Top