You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.1 KiB
113 lines
4.1 KiB
2 months ago
|
package rsp
|
||
|
|
||
|
var (
|
||
|
ErrOK = NewError(200, "OK", "ok") // 表示没有任何错误。
|
||
|
ErrInternal = NewError(500, "InternalError", "系统内部错误") // 客户端请求有效,但服务器处理时发生了意外。
|
||
|
ErrMethodNotAllowed = NewError(405, "MethodNotAllowed", "网络请求方法错误")
|
||
|
ErrNotFound = NewError(404, "NotFound", "请求资源不存在")
|
||
|
ErrLimitExecuted = NewError(403, "LimitExecuted", "访问频次超过限制")
|
||
|
ErrLimitDevice = NewError(400, "LimitDevice", "设备数超过限制")
|
||
|
ErrUnknownError = NewError(400, "UnknownError", "未知错误")
|
||
|
ErrBadParams = NewError(400, "BadParams", "提交的参数不符合要求")
|
||
|
ErrRecordNotFound = NewError(404, "RecordNotFound", "访问的数据不存在")
|
||
|
ErrRecordAlreadyExists = NewError(500, "RecordAlreadyExists", "数据已经存在")
|
||
|
ErrPermissionDenied = NewError(403, "PermissionDenied", "没有操作权限")
|
||
|
ErrServiceUnavailable = NewError(503, "ServiceUnavailable", "系统维护中")
|
||
|
ErrUnauthorized = NewError(401, "Unauthorized", "缺少身份验证凭据或身份凭据错误") // 用户未提供身份验证凭据,或者没有通过身份验证。
|
||
|
ErrForbidden = NewError(403, "Forbidden", "没有资源访问权限") // 用户通过了身份验证,但是不具有访问资源所需的权限。
|
||
|
ErrGone = NewError(410, "Gone", "访问的资源不存在") // 所请求的资源已从这个地址转移,不再可用。
|
||
|
ErrUnsupportedMediaType = NewError(415, "UnsupportedMediaType", "提交的数据格式错误") // 客户端要求的返回格式不支持,比如,API 只能返回 JSON 格式,但是客户端要求返回 XML 格式。
|
||
|
ErrUnprocessableEntity = NewError(422, "UnprocessableEntity", "上传附件错误") // 无法处理客户端上传的附件,导致请求失败。
|
||
|
ErrAlreadyAssociated = NewError(433, "AlreadyAssociated", "数据已被使用")
|
||
|
ErrBadRequest = NewError(400, "BadRequest", "请求无效") // 服务器不理解客户端的请求。
|
||
|
ErrDatabaseException = NewError(500, "DatabaseException", "数据库异常")
|
||
|
ErrCreateFailed = NewError(500, "CreateFailed", "创建数据失败")
|
||
|
ErrUpdateFailed = NewError(500, "UpdateFailed", "更新数据失败")
|
||
|
ErrDeleteFailed = NewError(500, "DeleteFailed", "删除数据失败")
|
||
|
ErrUnimplemented = NewError(500, "Unimplemented", "接口尚未实现")
|
||
|
)
|
||
|
|
||
|
type Error struct {
|
||
|
internal error // 包装的其它错误
|
||
|
status int // HTTP 状态码
|
||
|
code string // 请求错误码
|
||
|
text string // 响应提示消息
|
||
|
data any // 错误携带的响应数据
|
||
|
}
|
||
|
|
||
|
func NewError(status int, code, text string) *Error {
|
||
|
return &Error{nil, status, code, text, nil}
|
||
|
}
|
||
|
|
||
|
func (e *Error) Status() int {
|
||
|
return e.status
|
||
|
}
|
||
|
|
||
|
func (e *Error) Code() string {
|
||
|
return e.code
|
||
|
}
|
||
|
|
||
|
func (e *Error) Text() string {
|
||
|
return e.Text()
|
||
|
}
|
||
|
|
||
|
func (e *Error) Data() any {
|
||
|
return e.data
|
||
|
}
|
||
|
|
||
|
func (e *Error) Internal() error {
|
||
|
return e.internal
|
||
|
}
|
||
|
|
||
|
func (e *Error) Unwrap() error {
|
||
|
return e.Internal()
|
||
|
}
|
||
|
|
||
|
func (e *Error) String() string {
|
||
|
return e.text
|
||
|
}
|
||
|
|
||
|
func (e *Error) Error() string {
|
||
|
return e.text
|
||
|
}
|
||
|
|
||
|
func (e *Error) WithInternal(err error) *Error {
|
||
|
c := *e
|
||
|
c.internal = err
|
||
|
return &c
|
||
|
}
|
||
|
|
||
|
func (e *Error) WithText(text ...string) *Error {
|
||
|
if len(text) == 0 || text[0] == e.text {
|
||
|
return e
|
||
|
}
|
||
|
c := *e
|
||
|
c.text = text[0]
|
||
|
return &c
|
||
|
}
|
||
|
|
||
|
func (e *Error) WithData(data any) *Error {
|
||
|
if e.data == data {
|
||
|
return e
|
||
|
}
|
||
|
c := *e
|
||
|
c.data = data
|
||
|
return &c
|
||
|
}
|
||
|
|
||
|
type Problem struct {
|
||
|
Label string `json:"-" xml:"-"`
|
||
|
Code string `json:"code" xml:"code"`
|
||
|
Message string `json:"message" xml:"message"`
|
||
|
Problems map[string][]*Problem `json:"problems,omitempty" xml:"problems,omitempty"`
|
||
|
}
|
||
|
|
||
|
type Problems map[string][]*Problem
|
||
|
|
||
|
func (p Problems) Add(problem *Problem) {
|
||
|
if _, ok := p[problem.Label]; !ok {
|
||
|
p[problem.Label] = make([]*Problem, 0)
|
||
|
}
|
||
|
p[problem.Label] = append(p[problem.Label], problem)
|
||
|
}
|