-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrehttp.go
157 lines (134 loc) · 3.45 KB
/
rehttp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package rehttp
import (
"bytes"
"io"
"net/url"
"time"
)
type HTTP struct {
Client *Client
ResponseLimit int64
Timeout int64
RetryMax int
}
var DefaultClient = httpDefault()
// NewDefault 默认初始化的HTTP
func httpDefault() *HTTP {
var defaultHTTP = &HTTP{
Client: initHTTP(10, 3),
ResponseLimit: 0,
}
return defaultHTTP
}
func GlobalHttp(h *HTTP) {
DefaultClient.Timeout = h.Timeout
DefaultClient.RetryMax = h.RetryMax
DefaultClient.ResponseLimit = h.ResponseLimit
DefaultClient.Client = initHTTP(h.Timeout, h.RetryMax)
}
// New 创建HTTPClient
func New(http *HTTP) *HTTP {
h := &HTTP{
Client: initHTTP(http.Timeout, http.RetryMax),
ResponseLimit: http.ResponseLimit,
}
return h
}
// Post 发送POST请求
func (h *HTTP) Post(urlStr string, headers map[string]string, requestBody []byte) *Result {
u, err := url.Parse(urlStr)
if err != nil {
return &Result{URL: urlStr, Err: err}
}
startTime := time.Now()
req, err := NewRequest("POST", u.String(), bytes.NewBuffer(requestBody))
if err != nil {
return &Result{URL: u.String(), Err: err}
}
for key, value := range headers {
req.Header.Set(key, value)
}
resp, err := h.Client.Do(req)
if err != nil {
return &Result{URL: u.String(), Err: err}
}
defer func() {
if resp != nil {
resp.Body.Close()
}
}()
// 读取响应结果,有长度限制则截取部分内容
var bodyReader io.Reader = resp.Body
if h.ResponseLimit != 0 {
bodyReader = io.LimitReader(resp.Body, h.ResponseLimit)
}
b, err := io.ReadAll(bodyReader)
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
return &Result{URL: u.String(), Err: err}
}
// 执行花费时间
durationSeconds := time.Since(startTime).Seconds()
return &Result{
URL: u.String(),
ResponseBody: string(b),
StatusCode: resp.StatusCode,
Duration: durationSeconds,
}
}
func RPost(urlStr string, headers map[string]string, requestBody []byte) *Result {
result := DefaultClient.Post(urlStr, headers, requestBody)
return result
}
// Get 发送GET请求
func (h *HTTP) Get(t string, headers map[string]string) *Result {
u, err := url.Parse(t)
if err != nil {
return &Result{URL: t, Err: err}
}
startTime := time.Now()
req, err := NewRequest("GET", u.String(), nil)
if err != nil {
return &Result{URL: u.String(), Err: err}
}
for key, value := range headers {
req.Header.Set(key, value)
}
resp, err := h.Client.Do(req)
if err != nil {
return &Result{URL: u.String(), Err: err}
}
defer func() {
if resp != nil {
resp.Body.Close()
}
}()
// 读取响应结果,有长度限制则截取部分内容
var bodyReader io.Reader = resp.Body
if h.ResponseLimit != 0 {
bodyReader = io.LimitReader(resp.Body, h.ResponseLimit)
}
b, err := io.ReadAll(bodyReader)
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
return &Result{URL: u.String(), Err: err}
}
// 执行花费时间
duration := time.Since(startTime).Seconds()
return &Result{
URL: u.String(),
ResponseBody: string(b),
StatusCode: resp.StatusCode,
Duration: duration,
}
}
func RGet(t string, headers map[string]string) *Result {
result := DefaultClient.Get(t, headers)
return result
}
// 自带请求重试的HTTPClient
func initHTTP(timeout int64, retryMax int) *Client {
retryClient := NewClient()
retryClient.Logger = nil
retryClient.RetryMax = retryMax
retryClient.HTTPClient.Timeout = time.Duration(timeout) * time.Second
return retryClient
}