gin.go 1003 B

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