client.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package request
  2. import (
  3. "io"
  4. "net/http"
  5. "net/http/cookiejar"
  6. "strings"
  7. )
  8. type (
  9. BeforeRequest func(req *http.Request) (err error)
  10. AfterRequest func(req *http.Request, res *http.Response) (err error)
  11. Client struct {
  12. baseUrl string
  13. Authorization Authorization
  14. client *http.Client
  15. cookieJar *cookiejar.Jar
  16. interceptorRequest []BeforeRequest
  17. interceptorResponse []AfterRequest
  18. }
  19. )
  20. func (client *Client) stashUri(urlPath string) string {
  21. var (
  22. pos int
  23. )
  24. if len(urlPath) == 0 {
  25. return client.baseUrl
  26. }
  27. if pos = strings.Index(urlPath, "//"); pos == -1 {
  28. if client.baseUrl != "" {
  29. if urlPath[0] != '/' {
  30. urlPath = "/" + urlPath
  31. }
  32. return client.baseUrl + urlPath
  33. }
  34. }
  35. return urlPath
  36. }
  37. func (client *Client) BeforeRequest(cb BeforeRequest) *Client {
  38. client.interceptorRequest = append(client.interceptorRequest, cb)
  39. return client
  40. }
  41. func (client *Client) AfterRequest(cb AfterRequest) *Client {
  42. client.interceptorResponse = append(client.interceptorResponse, cb)
  43. return client
  44. }
  45. func (client *Client) SetBaseUrl(s string) *Client {
  46. client.baseUrl = strings.TrimSuffix(s, "/")
  47. return client
  48. }
  49. func (client *Client) SetCookieJar(cookieJar *cookiejar.Jar) *Client {
  50. client.client.Jar = cookieJar
  51. return client
  52. }
  53. func (client *Client) SetClient(httpClient *http.Client) *Client {
  54. client.client = httpClient
  55. if client.cookieJar != nil {
  56. client.client.Jar = client.cookieJar
  57. }
  58. return client
  59. }
  60. func (client *Client) SetTransport(transport http.RoundTripper) *Client {
  61. client.client.Transport = transport
  62. return client
  63. }
  64. func (client *Client) Get(urlPath string) *Request {
  65. return newRequest(http.MethodGet, client.stashUri(urlPath), client)
  66. }
  67. func (client *Client) Put(urlPath string) *Request {
  68. return newRequest(http.MethodPut, client.stashUri(urlPath), client)
  69. }
  70. func (client *Client) Post(urlPath string) *Request {
  71. return newRequest(http.MethodPost, client.stashUri(urlPath), client)
  72. }
  73. func (client *Client) Delete(urlPath string) *Request {
  74. return newRequest(http.MethodDelete, client.stashUri(urlPath), client)
  75. }
  76. func (client *Client) execute(r *Request) (res *http.Response, err error) {
  77. var (
  78. n int
  79. reader io.Reader
  80. )
  81. if r.contentType == "" && r.body != nil {
  82. r.contentType = r.detectContentType(r.body)
  83. }
  84. if r.body != nil {
  85. if reader, err = r.readRequestBody(r.contentType, r.body); err != nil {
  86. return
  87. }
  88. }
  89. if r.rawRequest, err = http.NewRequest(r.method, r.uri, reader); err != nil {
  90. return
  91. }
  92. for k, vs := range r.header {
  93. for _, v := range vs {
  94. r.rawRequest.Header.Add(k, v)
  95. }
  96. }
  97. if r.contentType != "" {
  98. r.rawRequest.Header.Set("Content-Type", r.contentType)
  99. }
  100. if client.Authorization != nil {
  101. r.rawRequest.Header.Set("Authorization", client.Authorization.Token())
  102. }
  103. if r.context != nil {
  104. r.rawRequest = r.rawRequest.WithContext(r.context)
  105. }
  106. n = len(client.interceptorRequest)
  107. for i := n - 1; i >= 0; i-- {
  108. if err = client.interceptorRequest[i](r.rawRequest); err != nil {
  109. return
  110. }
  111. }
  112. if r.rawResponse, err = client.client.Do(r.rawRequest); err != nil {
  113. return nil, err
  114. }
  115. n = len(client.interceptorResponse)
  116. for i := n - 1; i >= 0; i-- {
  117. if err = client.interceptorResponse[i](r.rawRequest, r.rawResponse); err != nil {
  118. _ = r.rawResponse.Body.Close()
  119. return
  120. }
  121. }
  122. return r.rawResponse, err
  123. }
  124. func New() *Client {
  125. client := &Client{
  126. client: http.DefaultClient,
  127. interceptorRequest: make([]BeforeRequest, 0, 10),
  128. interceptorResponse: make([]AfterRequest, 0, 10),
  129. }
  130. client.cookieJar, _ = cookiejar.New(nil)
  131. client.client.Jar = client.cookieJar
  132. return client
  133. }