1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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 未找到")
- }
- }
- }
|