Files
nl-video-api/api/middleware/response.go
2025-08-03 00:11:15 +08:00

75 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()
}