перед изменением
в настоящее время использует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/Бессердечный не…