Go — единообразное определение кодов ошибок API

Go

перед изменением

в настоящее время использует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()Установите уникальный идентификатор текущего запроса, который также может быть воспринят как идентификатор ссылки или проигнорирован.

.WithData()Данные возвращаются, когда настройка выполнена успешно.

Поделиться ниже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 — распространенная ошибка, обычно вызванная незаконными действиями пользователя.
  • Код ошибки на уровне модуля: представлен двумя цифрами, например, 01 — пользовательский модуль, 02 — модуль заказа.
  • Конкретный код ошибки: 2 цифры для обозначения, например, 01 означает, что номер мобильного телефона недействителен, 02 означает ошибку ввода кода подтверждения.

Приведенный выше код находится в проекте go-gin-api по адресу:GitHub.com/Бессердечный не…