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