Files

75 lines
1.9 KiB
Go
Raw Permalink Normal View History

2025-08-03 00:11:15 +08:00
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()
}