package middleware import ( "encoding/json" "net/http" "github.com/gin-gonic/gin" "github.com/levigross/grequests" ) // ResponseData 表示统一响应的JSON格式 type ResponseData struct { Code int `json:"code"` // 状态码 Message string `json:"message"` // 响应消息 Data interface{} `json:"data"` // 响应数据 } // ErrorResponse 错误响应 func ErrorResponse(c *gin.Context, code int, message string) { c.JSON(code, ResponseData{ Code: code, Message: message, Data: nil, }) } // SuccessResponse 成功响应 func SuccessResponse(c *gin.Context, code int, message string, data interface{}) { // 如果 data 是一个 JSON 字符串,尝试解析为 interface{} if jsonStr, ok := data.(string); ok { var jsonData interface{} err := json.Unmarshal([]byte(jsonStr), &jsonData) if err == nil { data = jsonData } } // 如果 data 是 *grequests.Response 类型 if resp, ok := data.(*grequests.Response); ok { var respData interface{} err := json.Unmarshal(resp.Bytes(), &respData) if err == nil { data = respData } } c.JSON(http.StatusOK, ResponseData{ Code: code, Message: message, Data: data, }) } // UnifiedResponseMiddleware是处理统一HTTP响应格式的中间件 func UnifiedResponseMiddleware() gin.HandlerFunc { return func(c *gin.Context) { c.Next() // 检查是否设置了响应状态码 if c.Writer.Status() == 0 { c.Writer.WriteHeader(http.StatusOK) } // 检查是否在处理请求时发生了错误 if len(c.Errors) > 0 { err := c.Errors.Last() if c.Writer.Status() != 0 && c.Writer.Status() != http.StatusOK { ErrorResponse(c, c.Writer.Status(), err.Error()) return } ErrorResponse(c, http.StatusInternalServerError, err.Error()) return } // 如果没有错误,则格式化响应 if c.Writer.Status() >= http.StatusOK && c.Writer.Status() < http.StatusMultipleChoices { data, exists := c.Get("res_data") // 如果是Json数据则直接返回 msg, isMsg := c.Get("res_msg") if exists && isMsg { SuccessResponse(c, c.Writer.Status(), msg.(string), data) return } if exists { SuccessResponse(c, c.Writer.Status(), "success", data) return } SuccessResponse(c, c.Writer.Status(), "success", nil) } // 处理 404 情况 if c.Writer.Status() == http.StatusNotFound { ErrorResponse(c, http.StatusNotFound, "404 未找到") } } }