71 lines
1.2 KiB
Go
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
|
|
}
|