Files
2023-08-18 11:55:54 +08:00

71 lines
1.2 KiB
Go

package request
import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"log"
"net/http"
"time"
)
type Request struct {
Timeout time.Duration
MaxRetry int
}
func NewRequest() *Request {
return &Request{
Timeout: time.Second * 2,
}
}
func (r *Request) SetTimeout(t time.Duration) {
r.Timeout = t
}
func (r *Request) SetMaxRetry(retry int) {
r.MaxRetry = retry
}
func (r *Request) Post(api string, data []byte) (string, error) {
client := &http.Client{
Timeout: r.Timeout,
}
req, err := http.NewRequest("POST", api, bytes.NewBuffer(data))
if err != nil {
return "", errors.New("Error creating request:" + err.Error())
}
req.Header.Set("Content-Type", "application/json")
retry := 0
reqDo:
resp, err := client.Do(req)
if err != nil {
if r.MaxRetry > 0 {
if retry < r.MaxRetry {
retry = retry + 1
log.Printf("请求api第[%d], 最大重试次数[%d]", retry, r.MaxRetry)
goto reqDo
}
}
return "", errors.New("Error sending request:" + err.Error())
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return "", fmt.Errorf("Error StatusCode: %d", resp.StatusCode)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", errors.New("Error read body: " + err.Error())
}
return string(body), nil
}