[系列] Go - 統一定義 API 錯誤碼


改之前

在使用 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,
})

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

改之后

// 比如,返回“用戶手機號不合法”錯誤
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 包源碼

// 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