You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

resty_client.go 2.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package restyclient
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "time"
  8. "github.com/go-resty/resty/v2"
  9. )
  10. type RestyClient struct {
  11. NoRedirectClient *resty.Client
  12. RestyClient *resty.Client
  13. HttpClient *http.Client
  14. }
  15. var UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
  16. var DefaultTimeout = time.Second * 300
  17. func InitClient(baseURL, apiKey string) *RestyClient {
  18. NoRedirectClient := resty.New().SetRedirectPolicy(
  19. resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
  20. return http.ErrUseLastResponse
  21. }),
  22. ).SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  23. NoRedirectClient.SetHeader("user-agent", UserAgent)
  24. restyClient := NewRestyClient(baseURL, apiKey)
  25. HttpClient := NewHttpClient()
  26. return &RestyClient{
  27. NoRedirectClient: NoRedirectClient,
  28. RestyClient: restyClient,
  29. HttpClient: HttpClient,
  30. }
  31. }
  32. func NewRestyClient(baseUrl, apiKey string) *resty.Client {
  33. client := resty.New().
  34. SetHeader("user-agent", UserAgent).
  35. SetRetryCount(3).
  36. SetBaseURL(baseUrl).
  37. SetRetryResetReaders(true).
  38. SetTimeout(DefaultTimeout).
  39. SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  40. return client
  41. }
  42. func NewHttpClient() *http.Client {
  43. return &http.Client{
  44. Timeout: time.Hour * 48,
  45. Transport: &http.Transport{
  46. Proxy: http.ProxyFromEnvironment,
  47. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  48. },
  49. }
  50. }
  51. // Request 封装了通用的 HTTP 请求方法
  52. func (c *RestyClient) Request(url string, method string, callback ReqCallback) ([]byte, error) {
  53. // 参数校验
  54. if url == "" {
  55. return nil, errors.New("URL cannot be empty")
  56. }
  57. respErr := &RespErr{}
  58. req := c.RestyClient.R().SetHeaders(map[string]string{
  59. "Content-Type": "application/json", // 回调仍可覆盖此Header
  60. }).SetError(respErr)
  61. switch method {
  62. case "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS":
  63. req.Method = method
  64. }
  65. req.URL = url
  66. if callback != nil {
  67. callback(req)
  68. }
  69. res, err := req.Send()
  70. if err != nil {
  71. return nil, fmt.Errorf("request to %s %s failed: %w", req.Method, req.URL, err)
  72. }
  73. // 处理非2xx响应
  74. if !res.IsSuccess() {
  75. if respErr.Message != "" {
  76. return nil, fmt.Errorf("server error: %s (status %d)", respErr.Message, res.StatusCode())
  77. }
  78. return nil, fmt.Errorf("unexpected status %d: %s", res.StatusCode(), res.String())
  79. }
  80. return res.Body(), nil
  81. }
  82. // Post 封装 POST 请求
  83. func (c *RestyClient) Post(path string, body interface{}, result interface{}) error {
  84. callback := func(req *resty.Request) {
  85. req.SetBody(body).SetResult(result)
  86. }
  87. _, err := c.Request(path, http.MethodPost, callback)
  88. return err
  89. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.