Go-統一定義 API 錯誤碼-Gin開發


轉載於https://mp.weixin.qq.com/s/gTFfUN2LEcsF0Q8iQan82A

改之前

在使用 gin 開發接口的時候,返回接口數據是這樣寫的。

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

這種寫法 code、msg 都是在哪需要返回在哪定義,沒有進行統一管理。

改之后

// 比如,返回“用戶手機號不合法”錯誤
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.ErrUserPhone、errno.OK 表示自定義的錯誤碼,下面會看到定義的地方。

.WithID() 設置當前請求的唯一ID,也可以理解為鏈路ID,忽略也可以。

.WithData() 設置成功時返回的數據。

下面分享下編寫的 errno 包源碼,非常簡單,希望大家不要介意。

errno 包源碼

// 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)
}
// 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 為驗證碼輸入錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM