http_client.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package client
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net/http"
  8. "time"
  9. )
  10. type HttpClient struct {
  11. *http.Client
  12. maxRetries int
  13. retryDelayFunc RetryDelayFunc
  14. }
  15. func GetInstance(timeout time.Duration, maxRetries int) *HttpClient {
  16. return &HttpClient{
  17. Client: &http.Client{Timeout: timeout},
  18. maxRetries: maxRetries,
  19. retryDelayFunc: defaultRetryDelayFunc,
  20. }
  21. }
  22. func defaultRetryDelayFunc(attempt int) time.Duration {
  23. delay := time.Duration(attempt) * time.Second
  24. if attempt > 0 {
  25. delay *= 2
  26. }
  27. return delay
  28. }
  29. type RetryDelayFunc func(attempt int) time.Duration
  30. // DoWithRetry 发送带有重试机制的HTTP请求,允许用户自定义重试延迟逻辑
  31. func (hc *HttpClient) DoWithRetry(ctx context.Context, req *http.Request) (*http.Response, error) {
  32. attempt := 0
  33. for {
  34. resp, err := hc.Do(req.WithContext(ctx))
  35. if err != nil {
  36. if attempt >= hc.maxRetries {
  37. return nil, fmt.Errorf("请求失败: %w", err)
  38. }
  39. attempt++
  40. delay := hc.retryDelayFunc(attempt)
  41. time.Sleep(delay)
  42. continue
  43. }
  44. return resp, nil
  45. }
  46. }
  47. func (hc *HttpClient) Post(url string, contentType string, buf io.Reader) (resp *http.Response, err error) {
  48. return
  49. }
  50. func (hc *HttpClient) Get(url string) (resp *http.Response, err error) {
  51. req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil)
  52. if err != nil {
  53. log.Fatalf("创建请求失败: %v", err)
  54. }
  55. resp, err = hc.DoWithRetry(req.Context(), req)
  56. return
  57. }