gitee.com/lh-her-team/common@v1.5.1/httputils/httputils.go (about)

     1  package httputils
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"time"
    10  )
    11  
    12  const (
    13  	// 默认超时时间,单位:s
    14  	DEFAULT_TIMEOUT = 5
    15  	MAX_RETRY_CNT   = 3
    16  )
    17  
    18  func GET(customClient *http.Client, url string) (respData []byte, err error) {
    19  	var (
    20  		resp *http.Response
    21  	)
    22  	var client = customClient
    23  	if customClient == nil {
    24  		client = &http.Client{
    25  			Timeout: DEFAULT_TIMEOUT * time.Second,
    26  		}
    27  	}
    28  	resp, err = client.Get(url)
    29  	if err != nil {
    30  		return nil, fmt.Errorf("http GET failed, %s", err.Error())
    31  	}
    32  	defer resp.Body.Close()
    33  	respData, err = ioutil.ReadAll(resp.Body)
    34  	if err != nil {
    35  		return nil, fmt.Errorf("read body failed, %s", err)
    36  	}
    37  	return
    38  }
    39  
    40  func POST(customClient *http.Client, url string, reqObj interface{}) (respData []byte, err error) {
    41  	var (
    42  		data []byte
    43  		req  *http.Request
    44  		resp *http.Response
    45  	)
    46  	data, err = json.Marshal(reqObj)
    47  	if err != nil {
    48  		return nil, fmt.Errorf("json marshal failed, %s", err.Error())
    49  	}
    50  	req, err = http.NewRequest(
    51  		"POST",
    52  		url,
    53  		bytes.NewBuffer(data))
    54  	if err != nil {
    55  		return nil, fmt.Errorf("new request failed, %s", err.Error())
    56  	}
    57  	req.Header.Set("Content-Type", "application/json")
    58  	req.Header.Set("charset", "UTF-8")
    59  	var client = customClient
    60  	if customClient == nil {
    61  		client = &http.Client{
    62  			Timeout: DEFAULT_TIMEOUT * time.Second,
    63  		}
    64  	}
    65  	cnt := 0
    66  	for {
    67  		resp, err = client.Do(req)
    68  		if err != nil {
    69  			cnt++
    70  			if cnt <= MAX_RETRY_CNT {
    71  				//log.Warnf("post failed, [cur:%d|max:%d] meet err: %s, and try again",
    72  				//	cnt, MAX_RETRY_CNT, err.Error())
    73  				time.Sleep(200 * time.Millisecond)
    74  				continue
    75  			}
    76  			return nil, fmt.Errorf("post failed, meet too many err: %s", err.Error())
    77  		}
    78  		break
    79  	}
    80  	defer resp.Body.Close()
    81  	respData, err = ioutil.ReadAll(resp.Body)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("read body failed, %s", err)
    84  	}
    85  	return
    86  }