util.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package eapi
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "io"
  6. )
  7. // Unmarshal 转换json
  8. func Unmarshal(body io.ReadCloser, v interface{}) (err error) {
  9. b, err := copyBody(body)
  10. if err != nil {
  11. return
  12. }
  13. out := new(bytes.Buffer)
  14. if _, err = out.ReadFrom(b); err != nil {
  15. return
  16. }
  17. if err = json.Unmarshal(out.Bytes(), &v); err != nil {
  18. return
  19. }
  20. return
  21. }
  22. // String 转换为字串符
  23. func String(body io.ReadCloser) (string, error) {
  24. b, err := copyBody(body)
  25. if err != nil {
  26. return "", err
  27. }
  28. out := new(bytes.Buffer)
  29. if _, err = out.ReadFrom(b); err != nil {
  30. return "", err
  31. }
  32. return out.String(), nil
  33. }
  34. // Bytes 转换为Bytes
  35. func Bytes(body io.ReadCloser) ([]byte, error) {
  36. b, err := copyBody(body)
  37. if err != nil {
  38. return nil, err
  39. }
  40. out := new(bytes.Buffer)
  41. if _, err = out.ReadFrom(b); err != nil {
  42. return nil, err
  43. }
  44. return out.Bytes(), nil
  45. }
  46. func copyBody(body io.ReadCloser) (*bytes.Buffer, error) {
  47. var (
  48. b1 = bytes.NewBuffer([]byte{})
  49. b2 = bytes.NewBuffer([]byte{})
  50. tr io.Reader
  51. )
  52. if body != nil {
  53. tr = io.TeeReader(body, b1)
  54. defer body.Close()
  55. if _, err := io.Copy(b2, tr); err != nil {
  56. return nil, err
  57. }
  58. defer func() { body = io.NopCloser(b1) }()
  59. }
  60. return b2, nil
  61. }