request.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package http
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "encoding/xml"
  7. "errors"
  8. "eta_mini_ht_api/common/utils/client"
  9. "github.com/medivhzhan/weapp/v3/logger"
  10. "net/http"
  11. )
  12. // ContentType 请求内容类型
  13. type ContentType uint
  14. const (
  15. ContentTypePlain ContentType = iota
  16. ContentTypeXML
  17. ContentTypeJSON
  18. )
  19. func (ctp ContentType) String() string {
  20. switch ctp {
  21. case ContentTypeXML:
  22. return "service/xml"
  23. case ContentTypeJSON:
  24. return "service/json"
  25. default:
  26. return "text/plain"
  27. }
  28. }
  29. type Request struct {
  30. http *client.HttpClient
  31. // 获取日志记录器
  32. logger func() logger.Logger
  33. contentType ContentType
  34. }
  35. func NewRequest(http *client.HttpClient, ctp ContentType, logger func() logger.Logger) *Request {
  36. return &Request{
  37. http: http,
  38. logger: logger,
  39. contentType: ctp,
  40. }
  41. }
  42. func (cli *Request) Get(url string, response interface{}) error {
  43. cli.logger().Info(context.Background(), "request url: %s", url)
  44. resp, err := cli.http.Get(url)
  45. if err != nil {
  46. cli.logger().Error(context.Background(), "get error: %s", err)
  47. return err
  48. }
  49. defer resp.Body.Close()
  50. switch cli.contentType {
  51. case ContentTypeXML:
  52. return xml.NewDecoder(resp.Body).Decode(response)
  53. case ContentTypeJSON:
  54. return json.NewDecoder(resp.Body).Decode(response)
  55. default:
  56. return errors.New("invalid content type")
  57. }
  58. }
  59. func (cli *Request) GetWithBody(url string) (*http.Response, error) {
  60. cli.logger().Info(context.Background(), "request url: %s", url)
  61. rsp, err := cli.http.Get(url)
  62. if err != nil {
  63. cli.logger().Error(context.Background(), "get with body error: %s", url)
  64. return nil, err
  65. }
  66. return rsp, nil
  67. }
  68. func (cli *Request) Post(url string, params interface{}, response interface{}) error {
  69. resp, err := cli.PostWithBody(url, params)
  70. if err != nil {
  71. cli.logger().Error(context.Background(), "post error: %s", err)
  72. return err
  73. }
  74. defer resp.Body.Close()
  75. switch cli.contentType {
  76. case ContentTypeXML:
  77. return xml.NewDecoder(resp.Body).Decode(response)
  78. case ContentTypeJSON:
  79. return json.NewDecoder(resp.Body).Decode(response)
  80. default:
  81. return errors.New("invalid content type")
  82. }
  83. }
  84. func (cli *Request) PostWithBody(url string, params interface{}) (*http.Response, error) {
  85. cli.logger().Info(context.Background(), "request url: %s", url)
  86. cli.logger().Info(context.Background(), "request params: %+v", params)
  87. buf := new(bytes.Buffer)
  88. if params != nil {
  89. switch cli.contentType {
  90. case ContentTypeXML:
  91. err := xml.NewEncoder(buf).Encode(params)
  92. if err != nil {
  93. return nil, err
  94. }
  95. case ContentTypeJSON:
  96. enc := json.NewEncoder(buf)
  97. enc.SetEscapeHTML(false)
  98. err := enc.Encode(params)
  99. if err != nil {
  100. return nil, err
  101. }
  102. default:
  103. return nil, errors.New("invalid content type")
  104. }
  105. }
  106. rsp, err := cli.http.Post(url, cli.contentType.String(), buf)
  107. if err != nil {
  108. cli.logger().Error(context.Background(), "post with body error: %s", url)
  109. return nil, err
  110. }
  111. return rsp, nil
  112. }