responseData.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package middleware
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/gin-gonic/gin"
  6. "github.com/levigross/grequests"
  7. )
  8. // ResponseData 表示统一响应的JSON格式
  9. type ResponseData struct {
  10. Code int `json:"code"` // 状态码
  11. Message string `json:"message"` // 响应消息
  12. Data interface{} `json:"data"` // 响应数据
  13. }
  14. // ErrorResponse 错误响应
  15. func ErrorResponse(c *gin.Context, code int, message string) {
  16. c.JSON(code, ResponseData{
  17. Code: code,
  18. Message: message,
  19. Data: nil,
  20. })
  21. }
  22. // SuccessResponse 成功响应
  23. func SuccessResponse(c *gin.Context, code int, message string, data interface{}) {
  24. // 如果 data 是一个 JSON 字符串,尝试解析为 interface{}
  25. if jsonStr, ok := data.(string); ok {
  26. var jsonData interface{}
  27. err := json.Unmarshal([]byte(jsonStr), &jsonData)
  28. if err == nil {
  29. data = jsonData
  30. }
  31. }
  32. // 如果 data 是 *grequests.Response 类型
  33. if resp, ok := data.(*grequests.Response); ok {
  34. var respData interface{}
  35. err := json.Unmarshal(resp.Bytes(), &respData)
  36. if err == nil {
  37. data = respData
  38. }
  39. }
  40. c.JSON(http.StatusOK, ResponseData{
  41. Code: code,
  42. Message: message,
  43. Data: data,
  44. })
  45. }
  46. // UnifiedResponseMiddleware是处理统一HTTP响应格式的中间件
  47. func UnifiedResponseMiddleware() gin.HandlerFunc {
  48. return func(c *gin.Context) {
  49. c.Next()
  50. // 检查是否设置了响应状态码
  51. if c.Writer.Status() == 0 {
  52. c.Writer.WriteHeader(http.StatusOK)
  53. }
  54. // 检查是否在处理请求时发生了错误
  55. if len(c.Errors) > 0 {
  56. err := c.Errors.Last()
  57. if c.Writer.Status() != 0 && c.Writer.Status() != http.StatusOK {
  58. ErrorResponse(c, c.Writer.Status(), err.Error())
  59. return
  60. }
  61. ErrorResponse(c, http.StatusInternalServerError, err.Error())
  62. return
  63. }
  64. // 如果没有错误,则格式化响应
  65. if c.Writer.Status() >= http.StatusOK && c.Writer.Status() < http.StatusMultipleChoices {
  66. data, exists := c.Get("res_data")
  67. // 如果是Json数据则直接返回
  68. msg, isMsg := c.Get("res_msg")
  69. if exists && isMsg {
  70. SuccessResponse(c, c.Writer.Status(), msg.(string), data)
  71. return
  72. }
  73. if exists {
  74. SuccessResponse(c, c.Writer.Status(), "success", data)
  75. return
  76. }
  77. SuccessResponse(c, c.Writer.Status(), "success", nil)
  78. }
  79. // 处理 404 情况
  80. if c.Writer.Status() == http.StatusNotFound {
  81. ErrorResponse(c, http.StatusNotFound, "404 未找到")
  82. }
  83. }
  84. }