139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package httpclient
 | ||
| 
 | ||
| import (
 | ||
| 	"sync"
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace"
 | ||
| 
 | ||
| 	"go.uber.org/zap"
 | ||
| )
 | ||
| 
 | ||
| var (
 | ||
| 	cache = &sync.Pool{
 | ||
| 		New: func() any {
 | ||
| 			return &option{
 | ||
| 				header: make(map[string][]string),
 | ||
| 			}
 | ||
| 		},
 | ||
| 	}
 | ||
| )
 | ||
| 
 | ||
| // Mock 定义接口Mock数据
 | ||
| type Mock func() (body []byte)
 | ||
| 
 | ||
| // Option 自定义设置http请求
 | ||
| type Option func(*option)
 | ||
| 
 | ||
| type basicAuth struct {
 | ||
| 	username string
 | ||
| 	password string
 | ||
| }
 | ||
| 
 | ||
| type option struct {
 | ||
| 	ttl         time.Duration
 | ||
| 	basicAuth   *basicAuth
 | ||
| 	header      map[string][]string
 | ||
| 	trace       *trace.Trace
 | ||
| 	dialog      *trace.Dialog
 | ||
| 	logger      *zap.Logger
 | ||
| 	retryTimes  int
 | ||
| 	retryDelay  time.Duration
 | ||
| 	retryVerify RetryVerify
 | ||
| 	alarmTitle  string
 | ||
| 	alarmObject AlarmObject
 | ||
| 	alarmVerify AlarmVerify
 | ||
| 	mock        Mock
 | ||
| }
 | ||
| 
 | ||
| func (o *option) reset() {
 | ||
| 	o.ttl = 0
 | ||
| 	o.basicAuth = nil
 | ||
| 	o.header = make(map[string][]string)
 | ||
| 	o.trace = nil
 | ||
| 	o.dialog = nil
 | ||
| 	o.logger = nil
 | ||
| 	o.retryTimes = 0
 | ||
| 	o.retryDelay = 0
 | ||
| 	o.retryVerify = nil
 | ||
| 	o.alarmTitle = ""
 | ||
| 	o.alarmObject = nil
 | ||
| 	o.alarmVerify = nil
 | ||
| 	o.mock = nil
 | ||
| }
 | ||
| 
 | ||
| func getOption() *option {
 | ||
| 	return cache.Get().(*option)
 | ||
| }
 | ||
| 
 | ||
| func releaseOption(opt *option) {
 | ||
| 	opt.reset()
 | ||
| 	cache.Put(opt)
 | ||
| }
 | ||
| 
 | ||
| // WithTTL 本次http请求最长执行时间
 | ||
| func WithTTL(ttl time.Duration) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.ttl = ttl
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithHeader 设置http header,可以调用多次设置多对key-value
 | ||
| func WithHeader(key, value string) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.header[key] = []string{value}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithBasicAuth 设置基础认证权限
 | ||
| func WithBasicAuth(username, password string) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.basicAuth = &basicAuth{
 | ||
| 			username: username,
 | ||
| 			password: password,
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithTrace 设置trace信息
 | ||
| func WithTrace(t trace.T) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		if t != nil {
 | ||
| 			opt.trace = t.(*trace.Trace)
 | ||
| 			opt.dialog = new(trace.Dialog)
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithLogger 设置logger以便打印关键日志
 | ||
| func WithLogger(logger *zap.Logger) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.logger = logger
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithMock 设置 mock 数据
 | ||
| func WithMock(m Mock) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.mock = m
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithOnFailedAlarm 设置告警通知
 | ||
| func WithOnFailedAlarm(alarmTitle string, alarmObject AlarmObject, alarmVerify AlarmVerify) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.alarmTitle = alarmTitle
 | ||
| 		opt.alarmObject = alarmObject
 | ||
| 		opt.alarmVerify = alarmVerify
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // WithOnFailedRetry 设置失败重试
 | ||
| func WithOnFailedRetry(retryTimes int, retryDelay time.Duration, retryVerify RetryVerify) Option {
 | ||
| 	return func(opt *option) {
 | ||
| 		opt.retryTimes = retryTimes
 | ||
| 		opt.retryDelay = retryDelay
 | ||
| 		opt.retryVerify = retryVerify
 | ||
| 	}
 | ||
| }
 |