Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

83 строки
2.0 KiB

  1. package utils
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "encoding/xml"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "reflect"
  10. "regexp"
  11. )
  12. var (
  13. jsonCheck = regexp.MustCompile("(?i:(?:application|text)/json)")
  14. xmlCheck = regexp.MustCompile("(?i:(?:application|text)/xml)")
  15. )
  16. // DetectContentType method is used to figure out `Request.Body` content type for request header
  17. func DetectContentType(body interface{}) string {
  18. contentType := "text/plain; charset=utf-8"
  19. kind := reflect.TypeOf(body).Kind()
  20. switch kind {
  21. case reflect.Struct, reflect.Map, reflect.Ptr:
  22. contentType = "application/json; charset=utf-8"
  23. case reflect.String:
  24. contentType = "text/plain; charset=utf-8"
  25. default:
  26. if b, ok := body.([]byte); ok {
  27. contentType = http.DetectContentType(b)
  28. } else if kind == reflect.Slice {
  29. contentType = "application/json; charset=utf-8"
  30. }
  31. }
  32. return contentType
  33. }
  34. // SetBody Set request body from an interface{}
  35. func SetBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
  36. if bodyBuf == nil {
  37. bodyBuf = &bytes.Buffer{}
  38. }
  39. switch v := body.(type) {
  40. case io.Reader:
  41. _, err = bodyBuf.ReadFrom(v)
  42. case []byte:
  43. _, err = bodyBuf.Write(v)
  44. case string:
  45. _, err = bodyBuf.WriteString(v)
  46. case *string:
  47. _, err = bodyBuf.WriteString(*v)
  48. default:
  49. if jsonCheck.MatchString(contentType) {
  50. bodyType := reflect.TypeOf(body)
  51. if bodyType.Kind() == reflect.Ptr {
  52. bodyType = bodyType.Elem()
  53. }
  54. if bodyType.NumField() == 1 && bodyType.Field(0).Type.Kind() == reflect.Slice {
  55. if IsUnSet(bodyType.Field(0).Tag.Get("json")) {
  56. v := reflect.ValueOf(body)
  57. if v.Kind() == reflect.Ptr {
  58. v = v.Elem()
  59. }
  60. body = v.Field(0).Interface()
  61. }
  62. }
  63. err = json.NewEncoder(bodyBuf).Encode(body)
  64. } else if xmlCheck.MatchString(contentType) {
  65. err = xml.NewEncoder(bodyBuf).Encode(body)
  66. }
  67. }
  68. if err != nil {
  69. return nil, err
  70. }
  71. if bodyBuf.Len() == 0 {
  72. err = fmt.Errorf("Invalid body type %s", contentType)
  73. return nil, err
  74. }
  75. return bodyBuf, nil
  76. }