|
- package poster
-
- import (
- "bytes"
- "encoding/json"
- "io/ioutil"
- "net/http"
- "time"
-
- "github.com/toolkits/pkg/logger"
- )
-
- func PostJSON(url string, timeout time.Duration, v interface{}, retries ...int) (response []byte, code int, err error) {
- var bs []byte
-
- bs, err = json.Marshal(v)
- if err != nil {
- return
- }
-
- bf := bytes.NewBuffer(bs)
-
- client := http.Client{
- Timeout: timeout,
- }
-
- req, err := http.NewRequest("POST", url, bf)
- req.Header.Set("Content-Type", "application/json")
-
- var resp *http.Response
-
- if len(retries) > 0 {
- for i := 0; i < retries[0]; i++ {
- resp, err = client.Do(req)
- if err == nil {
- break
- }
-
- tryagain := ""
- if i+1 < retries[0] {
- tryagain = " try again"
- }
-
- logger.Warningf("failed to curl %s error: %s"+tryagain, url, err)
-
- if i+1 < retries[0] {
- time.Sleep(time.Millisecond * 200)
- }
- }
- } else {
- resp, err = client.Do(req)
- }
-
- if err != nil {
- return
- }
-
- code = resp.StatusCode
-
- if resp.Body != nil {
- defer resp.Body.Close()
- response, err = ioutil.ReadAll(resp.Body)
- }
-
- return
- }
|