经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[系列] Go - 统一定义 API 错误码
来源:cnblogs  作者:新亮笔记  时间:2020/12/28 9:54:47  对本文有异议

改之前

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

  1. type response struct {
  2. Code int `json:"code"`
  3. Msg string `json:"msg"`
  4. Data interface{} `json:"data"`
  5. }
  6. // always return http.StatusOK
  7. c.JSON(http.StatusOK, response{
  8. Code: 20101,
  9. Msg: "用户手机号不合法",
  10. Data: nil,
  11. })

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

改之后

  1. // 比如,返回“用户手机号不合法”错误
  2. c.JSON(http.StatusOK, errno.ErrUserPhone.WithID(c.GetString("trace-id")))
  3. // 正确返回
  4. c.JSON(http.StatusOK, errno.OK.WithData(data).WithID(c.GetString("trace-id")))

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

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

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

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

errno 包源码

  1. // errno/errno.go
  2. package errno
  3. import (
  4. "encoding/json"
  5. )
  6. var _ Error = (*err)(nil)
  7. type Error interface {
  8. // i 为了避免被其他包实现
  9. i()
  10. // WithData 设置成功时返回的数据
  11. WithData(data interface{}) Error
  12. // WithID 设置当前请求的唯一ID
  13. WithID(id string) Error
  14. // ToString 返回 JSON 格式的错误详情
  15. ToString() string
  16. }
  17. type err struct {
  18. Code int `json:"code"` // 业务编码
  19. Msg string `json:"msg"` // 错误描述
  20. Data interface{} `json:"data"` // 成功时返回的数据
  21. ID string `json:"id,omitempty"` // 当前请求的唯一ID,便于问题定位,忽略也可以
  22. }
  23. func NewError(code int, msg string) Error {
  24. return &err{
  25. Code: code,
  26. Msg: msg,
  27. Data: nil,
  28. }
  29. }
  30. func (e *err) i() {}
  31. func (e *err) WithData(data interface{}) Error {
  32. e.Data = data
  33. return e
  34. }
  35. func (e *err) WithID(id string) Error {
  36. e.ID = id
  37. return e
  38. }
  39. // ToString 返回 JSON 格式的错误详情
  40. func (e *err) ToString() string {
  41. err := &struct {
  42. Code int `json:"code"`
  43. Msg string `json:"msg"`
  44. Data interface{} `json:"data"`
  45. ID string `json:"id,omitempty"`
  46. }{
  47. Code: e.Code,
  48. Msg: e.Msg,
  49. Data: e.Data,
  50. ID: e.ID,
  51. }
  52. raw, _ := json.Marshal(err)
  53. return string(raw)
  54. }
  1. // errno/code.go
  2. package errno
  3. var (
  4. // OK
  5. OK = NewError(0, "OK")
  6. // 服务级错误码
  7. ErrServer = NewError(10001, "服务异常,请联系管理员")
  8. ErrParam = NewError(10002, "参数有误")
  9. ErrSignParam = NewError(10003, "签名参数有误")
  10. // 模块级错误码 - 用户模块
  11. ErrUserPhone = NewError(20101, "用户手机号不合法")
  12. ErrUserCaptcha = NewError(20102, "用户验证码有误")
  13. // ...
  14. )

错误码规则

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

错误码为 5 位数

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

原文链接:http://www.cnblogs.com/xinliangcoder/p/14197801.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号