Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go - 统一定义 API 错误码

Go - 统一定义 API 错误码

作者头像
新亮
发布于 2021-01-05 03:20:02
发布于 2021-01-05 03:20:02
1.4K00
代码可运行
举报
文章被收录于专栏:新亮笔记新亮笔记
运行总次数:0
代码可运行

改之前

在使用 gin 开发接口的时候,返回接口数据是这样写的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type response struct {
 Code int         `json:"code"`
 Msg  string      `json:"msg"`
 Data interface{} `json:"data"`
}

// always return http.StatusOK
c.JSON(http.StatusOK, response{
 Code: 20101,
 Msg:  "用户手机号不合法",
 Data: nil,
})

这种写法 codemsg 都是在哪需要返回在哪定义,没有进行统一管理。

改之后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 比如,返回“用户手机号不合法”错误
c.JSON(http.StatusOK, errno.ErrUserPhone.WithID(c.GetString("trace-id")))

// 正确返回
c.JSON(http.StatusOK, errno.OK.WithData(data).WithID(c.GetString("trace-id")))

errno.ErrUserPhoneerrno.OK 表示自定义的错误码,下面会看到定义的地方。

.WithID() 设置当前请求的唯一ID,也可以理解为链路ID,忽略也可以。

.WithData() 设置成功时返回的数据。

下面分享下编写的 errno 包源码,非常简单,希望大家不要介意。

errno 包源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// errno/errno.go

package errno

import (
 "encoding/json"
)

var _ Error = (*err)(nil)

type Error interface {
 // i 为了避免被其他包实现
 i()
 // WithData 设置成功时返回的数据
 WithData(data interface{}) Error
 // WithID 设置当前请求的唯一ID
 WithID(id string) Error
 // ToString 返回 JSON 格式的错误详情
 ToString() string
}

type err struct {
 Code int         `json:"code"`         // 业务编码
 Msg  string      `json:"msg"`          // 错误描述
 Data interface{} `json:"data"`         // 成功时返回的数据
 ID   string      `json:"id,omitempty"` // 当前请求的唯一ID,便于问题定位,忽略也可以
}

func NewError(code int, msg string) Error {
 return &err{
  Code: code,
  Msg:  msg,
  Data: nil,
 }
}

func (e *err) i() {}

func (e *err) WithData(data interface{}) Error {
 e.Data = data
 return e
}

func (e *err) WithID(id string) Error {
 e.ID = id
 return e
}

// ToString 返回 JSON 格式的错误详情
func (e *err) ToString() string {
 err := &struct {
  Code int         `json:"code"`
  Msg  string      `json:"msg"`
  Data interface{} `json:"data"`
  ID   string      `json:"id,omitempty"`
 }{
  Code: e.Code,
  Msg:  e.Msg,
  Data: e.Data,
  ID:   e.ID,
 }

 raw, _ := json.Marshal(err)
 return string(raw)
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// errno/code.go

package errno

var (
 // OK
 OK = NewError(0, "OK")

 // 服务级错误码
 ErrServer    = NewError(10001, "服务异常,请联系管理员")
 ErrParam     = NewError(10002, "参数有误")
 ErrSignParam = NewError(10003, "签名参数有误")

 // 模块级错误码 - 用户模块
 ErrUserPhone   = NewError(20101, "用户手机号不合法")
 ErrUserCaptcha = NewError(20102, "用户验证码有误")

 // ...
)

错误码规则

  • 错误码需在 code.go 文件中定义。
  • 错误码需为 > 0 的数,反之表示正确。
错误码为 5 位数

1

01

01

服务级错误码

模块级错误码

具体错误码

  • 服务级别错误码:1 位数进行表示,比如 1 为系统级错误;2 为普通错误,通常是由用户非法操作引起。
  • 模块级错误码:2 位数进行表示,比如 01 为用户模块;02 为订单模块。
  • 具体错误码:2 位数进行表示,比如 01 为手机号不合法;02 为验证码输入错误。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新亮笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言错误码设计与管理实践
最近在做一个和前端、第三方平台(可以简单理解为公司别的部门或者客户软件)直接交互的服务,涉及到用户注册、登录、数据处理等模块。架构图大概如下:
xin猿意码
2023/10/18
9750
Go语言错误码设计与管理实践
Go项目Error的统一规划管理和处理策略
上一篇文章我们详细讲解了怎么在搭建项目时实现 Go 的error interface 创建项目自己的Error,我们还给这个Error增加了记录错误原因和发生位置的能力。
KevinYan
2024/11/23
1400
Go项目Error的统一规划管理和处理策略
手把手,带你从零封装Gin框架(六):初始化 Validator & 封装 Response & 实现第一个接口
Gin 自带验证器返回的错误信息格式不太友好,本篇将进行调整,实现自定义错误信息,并规范接口返回的数据格式,分别为每种类型的错误定义错误码,前端可以根据对应的错误码实现后续不同的逻辑操作,篇末会使用自定义的 Validator 和 Response 实现第一个接口
用户10002156
2024/01/17
1.6K0
手把手,带你从零封装Gin框架(六):初始化 Validator & 封装 Response & 实现第一个接口
如何设计 API 接口,实现统一格式返回?
我们都知道,前端通常会通过后台提供的接口来获取数据来完成前端页面的渲染,前端可以为 PC 端、M 端、小程序、APP 等。
新亮
2021/06/21
1.5K0
学会定制化 Go 项目的 error,回溯错误的原因和发生位置
‍Go语言的Error处理一直被人吐槽,吐槽的点除了一个接一个的 if err != nil 的判断外,还有人说Go的错误太原始不能像其他语言那样在抛出异常的时候的时候传一个Casue Exception 把导致异常的整个原因链串起来。
KevinYan
2024/11/23
2780
学会定制化 Go 项目的 error,回溯错误的原因和发生位置
从零开发区块链应用(四)--自定义业务错误信息
上面介绍了错误码的一些知识,这一部分讲开发中是如何使用 自定义错误函数来处理错误信息的。为了演示,我们新增一个根据手机号获取验证码的 API:
Tiny熊
2022/02/22
4640
Gin 优雅设置回包
要设置 Gin 框架中的回包内容,可以使用 Gin 的上下文对象(c *gin.Context)来完成。可以通过以下代码来设置回包内容:
恋喵大鲤鱼
2023/03/01
9860
使用 Go HTTP 框架 Hertz 进行 JWT 认证
上一篇文章简单介绍了一个高性能的 Go HTTP 框架——Hertz,本篇文章将围绕 Hertz 开源仓库的一个 demo,讲述如何使用 Hertz 完成 JWT 的认证与授权流程。
白泽z
2022/12/20
1.4K0
使用 Go HTTP 框架 Hertz 进行 JWT 认证
Gin框架 - 自定义错误处理
很多读者在后台向我要 Gin 框架实战系列的 Demo 源码,在这里再说明一下,源码我都更新到 GitHub 上,地址:https://github.com/xinliangnote/Go
新亮
2019/07/29
1.8K0
gin博客项目复盘--03错误处理、数据验证
错误处理 错误码标准化,接口返回错误代码,以供前端使用查看。 创建 /utils/errmsg/errmsg.go package errmsg const ( SUCCSE = 200 ERROR = 500 // code= 1000... 用户模块的错误 ERROR_USERNAME_USED = 1001 ERROR_PASSWORD_WRONG = 1002 //... ) var codemsg = map[int]string{ SUCCSE: "ok",
微客鸟窝
2022/11/07
4330
gin博客项目复盘--03错误处理、数据验证
Go项目实战-让自定义Error支持Go的errors.Is判定以及原型模式的应用
经过前面三节高代码强度的学习,相信大家都已经有点累了,本节我们不着急继续“赶路”,休息片刻!我们换个轻松点的话题,聊一聊咱们项目定制化Error--AppError 怎么支持Go语言的 errors.Is 判定,以及项目预定义的那些Error在实际使用过程中某些情况下会出现循环引用的问题,我们会利用一个原型设计模式来解决这个问题。
KevinYan
2025/01/20
1690
Go项目实战-让自定义Error支持Go的errors.Is判定以及原型模式的应用
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.4K0
Gin-Web-Framework官方指南中文(下篇)
如何优雅的设计一个SDK
相信很多开发同学一定都听说过SDK,SDK全称Software Development Kit,即软件开发工具包。它是由硬件平台、操作系统或编程语言的制造商提供的一套工具,协助软件开发人员面向特定的平台、系统或编程语言创建应用。SDK经常被用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。
闫同学
2023/11/18
1.9K1
Golang快速开发框架——新增统一消息处理模块(七)
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
cn華少
2022/03/04
3660
Golang快速开发框架——新增统一消息处理模块(七)
优化gin表单的错误提示信息
创建一个简单的登录例子,我们对username和password绑定了required标签,代表着请求login接口的参数中必须包含这两个字段。
编程黑洞
2023/03/06
1.1K0
在gin框架中使用JWT
JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。
luckpunk
2023/09/10
6040
go的gin和gorm框架实现切换身份的接口
使用go的gin和gorm框架实现切换身份的接口,接收前端发送的JSON对象,查询数据库并更新,返回前端信息
叶茂林
2023/08/13
2960
go的gin和gorm框架实现切换身份的接口
GoFrame 错误处理的常用方法&错误码的使用
这篇文章将为大家介绍:GoFrame 错误处理的常用方法&错误码的使用。如何自定义错误对象、如何忽略部分堆栈信息、如何自定义错误码的返回、如何获取error对象中的错误码。
阿珍
2022/06/24
1.3K0
gin博客项目复盘--05 JWT全面解读、详细使用步骤
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串。
微客鸟窝
2022/11/07
5810
gin博客项目复盘--05 JWT全面解读、详细使用步骤
Go - 实现项目内链路追踪
当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。
新亮
2021/02/03
5430
Go - 实现项目内链路追踪
推荐阅读
相关推荐
Go语言错误码设计与管理实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验