gin.go 1021 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "github.com/gin-gonic/gin"
  6. "io"
  7. "strings"
  8. )
  9. const KeyRequestBody = "key_request_body"
  10. func GetRequestBody(c *gin.Context) ([]byte, error) {
  11. requestBody, _ := c.Get(KeyRequestBody)
  12. if requestBody != nil {
  13. return requestBody.([]byte), nil
  14. }
  15. requestBody, err := io.ReadAll(c.Request.Body)
  16. if err != nil {
  17. return nil, err
  18. }
  19. _ = c.Request.Body.Close()
  20. c.Set(KeyRequestBody, requestBody)
  21. return requestBody.([]byte), nil
  22. }
  23. func UnmarshalBodyReusable(c *gin.Context, v any) error {
  24. requestBody, err := GetRequestBody(c)
  25. if err != nil {
  26. return err
  27. }
  28. contentType := c.Request.Header.Get("Content-Type")
  29. if strings.HasPrefix(contentType, "application/json") {
  30. err = json.Unmarshal(requestBody, &v)
  31. } else {
  32. // skip for now
  33. // TODO: someday non json request have variant model, we will need to implementation this
  34. }
  35. if err != nil {
  36. return err
  37. }
  38. // Reset request body
  39. c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
  40. return nil
  41. }