75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package middleware
|
||
|
||
import (
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/net/ghttp"
|
||
"nl-video-api/utility/response"
|
||
)
|
||
|
||
// ResponseHandler 全局响应处理中间件
|
||
// 确保所有响应都返回HTTP 200状态码,错误信息通过code和message字段传递
|
||
func ResponseHandler(r *ghttp.Request) {
|
||
// 设置默认响应头
|
||
r.Response.Header().Set("Content-Type", "application/json")
|
||
|
||
// 继续执行后续中间件和处理函数
|
||
r.Middleware.Next()
|
||
|
||
// 检查响应状态码,如果不是200,则转换为统一格式
|
||
if r.Response.Status != 200 {
|
||
// 获取原始状态码
|
||
originalStatus := r.Response.Status
|
||
|
||
// 根据HTTP状态码映射到业务错误码
|
||
var businessCode int
|
||
var message string
|
||
|
||
switch originalStatus {
|
||
case 400:
|
||
businessCode = response.CodeInvalidParam
|
||
message = "请求参数错误"
|
||
case 401:
|
||
businessCode = response.CodeUnauthorized
|
||
message = "未授权访问"
|
||
case 403:
|
||
businessCode = response.CodeForbidden
|
||
message = "权限不足"
|
||
case 404:
|
||
businessCode = response.CodeNotFound
|
||
message = "资源不存在"
|
||
case 500:
|
||
businessCode = response.CodeServerError
|
||
message = "服务器内部错误"
|
||
default:
|
||
businessCode = response.CodeError
|
||
message = "请求处理失败"
|
||
}
|
||
|
||
// 清空原有响应内容
|
||
r.Response.ClearBuffer()
|
||
|
||
// 返回统一格式的错误响应,HTTP状态码为200
|
||
response.Error(r, businessCode, message)
|
||
}
|
||
}
|
||
|
||
// ErrorHandler 错误处理中间件
|
||
// 捕获panic和其他未处理的错误,统一返回格式
|
||
func ErrorHandler(r *ghttp.Request) {
|
||
defer func() {
|
||
if err := recover(); err != nil {
|
||
// 记录错误日志
|
||
g.Log().Errorf(r.Context(), "Panic recovered: %v", err)
|
||
|
||
// 清空响应缓冲区
|
||
r.Response.ClearBuffer()
|
||
|
||
// 返回统一格式的错误响应
|
||
response.Error(r, response.CodeServerError, "系统内部错误")
|
||
}
|
||
}()
|
||
|
||
// 继续执行后续中间件和处理函数
|
||
r.Middleware.Next()
|
||
}
|