| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 
							- package httpclient
 
- import (
 
- 	"bytes"
 
- 	"encoding/json"
 
- 	"errors"
 
- 	"io/ioutil"
 
- 	"net"
 
- 	"net/http"
 
- 	"time"
 
- 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 
- 	"gitee.com/xuyiping_admin/pkg/xerr"
 
- 	"go.uber.org/zap"
 
- )
 
- type Service struct {
 
- 	authClient *http.Client
 
- }
 
- func NewClientService() *Service {
 
- 	return &Service{
 
- 		authClient: &http.Client{
 
- 			Timeout: time.Duration(60) * time.Second,
 
- 		},
 
- 	}
 
- }
 
- type Header struct {
 
- 	Key   string `json:"key"`
 
- 	Value string `json:"value"`
 
- }
 
- func (c *Service) doRequest(req *http.Request) ([]byte, error) {
 
- 	resp, err := c.authClient.Do(req)
 
- 	if err != nil {
 
- 		var nErr net.Error
 
- 		if errors.As(err, &nErr) && nErr.Timeout() {
 
- 			for i := 0; i < 3; i++ {
 
- 				time.Sleep(15 * time.Second)
 
- 				resp, err = c.authClient.Do(req)
 
- 				if err != nil {
 
- 					zaplog.Error("ClientService", zap.Any("for", i), zap.Any("authClient.Do", err))
 
- 					if i == 3 {
 
- 						return nil, xerr.WithStack(err)
 
- 					}
 
- 				} else {
 
- 					break
 
- 				}
 
- 			}
 
- 		} else {
 
- 			zaplog.Error("ClientService", zap.Any("authClient.Do", err))
 
- 			return nil, xerr.WithStack(err)
 
- 		}
 
- 	}
 
- 	defer resp.Body.Close()
 
- 	b, err := ioutil.ReadAll(resp.Body)
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("ioutil.ReadAll", err))
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	if resp.StatusCode != http.StatusOK {
 
- 		if len(b) > 0 {
 
- 			return nil, xerr.Customf("err:%v,body:%s", err, string(b))
 
- 		} else {
 
- 			return nil, xerr.Customf("err:%v", err)
 
- 		}
 
- 	}
 
- 	return b, nil
 
- }
 
- func (c *Service) DoGet(url string, headers []*Header) ([]byte, error) {
 
- 	req, err := http.NewRequest(http.MethodGet, url, nil)
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("DoGet", err))
 
- 		return nil, err
 
- 	}
 
- 	req.Header.Add("Accept", "application/json")
 
- 	req.Header.Add("Content-Type", "application/json")
 
- 	if headers != nil {
 
- 		for _, v := range headers {
 
- 			req.Header.Add(v.Key, v.Value)
 
- 		}
 
- 	}
 
- 	return c.doRequest(req)
 
- }
 
- func (c *Service) DoPut(url string, body interface{}, headers []*Header) ([]byte, error) {
 
- 	b, err := json.Marshal(body)
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("DoPost-Marshal", err))
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	req, err := http.NewRequest(http.MethodPut, url, bytes.NewReader(b))
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("DoGet", err))
 
- 		return nil, err
 
- 	}
 
- 	req.Header.Add("Accept", "application/json")
 
- 	req.Header.Add("Content-Type", "application/json")
 
- 	if headers != nil {
 
- 		for _, v := range headers {
 
- 			req.Header.Add(v.Key, v.Value)
 
- 		}
 
- 	}
 
- 	return c.doRequest(req)
 
- }
 
- func (c *Service) DoPost(url string, body interface{}, headers []*Header) ([]byte, error) {
 
- 	b, err := json.Marshal(body)
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("DoPost-Marshal", err))
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(b))
 
- 	if err != nil {
 
- 		zaplog.Error("ClientService", zap.Any("NewRequest", err))
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	req.Header.Add("Accept", "application/json")
 
- 	req.Header.Add("Content-Type", "application/json")
 
- 	if headers != nil {
 
- 		for _, v := range headers {
 
- 			req.Header.Add(v.Key, v.Value)
 
- 		}
 
- 	}
 
- 	return c.doRequest(req)
 
- }
 
 
  |