From b338b87a025a1f51df2f4dbcf7c991a432fd78ff Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 15 Aug 2019 08:54:02 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E8=B6=85=E9=A2=91=E9=87=8D=E8=A7=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=94=B9=E4=B8=BA=E6=8C=89=E5=B9=82=E5=A2=9E?= =?UTF-8?q?=E9=95=BF=20+=20jdapi.NewPageOnly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platformapi/jdapi/jdapi.go | 7 +++++++ platformapi/platformapi.go | 32 +++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/platformapi/jdapi/jdapi.go b/platformapi/jdapi/jdapi.go index 6228f09b..c6cbe5e4 100644 --- a/platformapi/jdapi/jdapi.go +++ b/platformapi/jdapi/jdapi.go @@ -144,6 +144,13 @@ func New(token, appKey, appSecret string, config ...*platformapi.APIConfig) *API } } +func NewPageOnly(cookie string, config ...*platformapi.APIConfig) *API { + api := New("", "", "", config...) + api.SetCookie(accessStorePageCookieName, cookie) + api.SetCookie(accessStorePageCookieName2, cookie) + return api +} + func (a *API) AccessAPI2(apiStr string, jdParams map[string]interface{}, traceInfo string) (retVal map[string]interface{}, err error) { params := make(map[string]interface{}) params["v"] = "1.0" diff --git a/platformapi/platformapi.go b/platformapi/platformapi.go index 4e51acd5..7b313a73 100644 --- a/platformapi/platformapi.go +++ b/platformapi/platformapi.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "io/ioutil" + "math" "net" "net/http" "net/url" @@ -17,18 +18,18 @@ import ( ) const ( - DefClientTimeout = 30 * time.Second - DefSleepSecondWhenExceedLimit = 3 * time.Second - DefMaxRecoverableRetryCount = 1 - DefMaxExceedLimitRetryCount = 25 + DefClientTimeout = 30 * time.Second + DefMaxSleepSecondWhenExceedLimit = 62 // 超频类错误最大重试间隙(秒) + DefMaxExceedLimitRetryCount = 25 // 超频类错误最大重试次数 + DefMaxRecoverableRetryCount = 1 // 可恢复类错误(一般指网络错),最大重试次数 KeyTrackInfo = "TrackInfo" ) type APIRetryConfig struct { - MaxExceedLimitRetryCount int - MaxRecoverableRetryCount int - SleepSecondWhenExceedLimit time.Duration + MaxExceedLimitRetryCount int + MaxRecoverableRetryCount int + MaxSleepSecondWhenExceedLimit int } type APIConfig struct { @@ -45,9 +46,9 @@ type AccessPlatformAPIWithRetryParam struct { var ( DefAPIConfig = APIConfig{ APIRetryConfig: APIRetryConfig{ - MaxExceedLimitRetryCount: DefMaxExceedLimitRetryCount, - MaxRecoverableRetryCount: DefMaxRecoverableRetryCount, - SleepSecondWhenExceedLimit: DefSleepSecondWhenExceedLimit, + MaxExceedLimitRetryCount: DefMaxExceedLimitRetryCount, + MaxRecoverableRetryCount: DefMaxRecoverableRetryCount, + MaxSleepSecondWhenExceedLimit: DefMaxSleepSecondWhenExceedLimit, }, ClientTimeout: DefClientTimeout, } @@ -90,6 +91,11 @@ func getClonedData(requestURL *url.URL, r *bytes.Buffer) string { return retVal } +func NewDefAPIConfig() (conf *APIConfig) { + obj := DefAPIConfig + return &obj +} + func AccessPlatformAPIWithRetry(client *http.Client, handleRequest func() *http.Request, config *APIConfig, handleResponse func(response *http.Response, bodyStr string, bodyMap map[string]interface{}) (string, error)) error { exceedLimitRetryCount := 0 recoverableErrorRetryCount := 0 @@ -172,7 +178,11 @@ func AccessPlatformAPIWithRetry(client *http.Client, handleRequest func() *http. } else if errLevel == ErrLevelExceedLimit { exceedLimitRetryCount++ if exceedLimitRetryCount <= config.MaxExceedLimitRetryCount { - time.Sleep(config.SleepSecondWhenExceedLimit) + sleepSeconds := int(math.Exp2(float64(exceedLimitRetryCount))) + if sleepSeconds > config.MaxSleepSecondWhenExceedLimit { + sleepSeconds = config.MaxSleepSecondWhenExceedLimit + } + time.Sleep(time.Duration(sleepSeconds) * time.Second) continue } } else if errLevel == ErrLevelRecoverableErr {