From ff06369a23a3175e0546ec23224c518e074cac67 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 27 Feb 2019 14:19:23 +0800 Subject: [PATCH] - add utils.TryUnmarshalUseNumber - remove utils.HTTPResponse2Json --- platformapi/platformapi.go | 15 ++++++++++++--- utils/typeconv.go | 26 +++++++------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/platformapi/platformapi.go b/platformapi/platformapi.go index 7f23b914..69a02fab 100644 --- a/platformapi/platformapi.go +++ b/platformapi/platformapi.go @@ -138,10 +138,19 @@ func AccessPlatformAPIWithRetry(client *http.Client, handleRequest func() *http. } return ErrHTTPCodeIsNot200 } - var errLevel string - bodyMap, err := utils.HTTPResponse2Json(response) + var ( + errLevel string + bodyMap map[string]interface{} + ) + bodyData, err := ioutil.ReadAll(response.Body) if err != nil { - errLevel = ErrLevelRecoverableErr // 京东到家偶尔会返回HTML,重试 + baseapi.SugarLogger.Errorf("AccessPlatformAPIWithRetry:%s url:%v, request:%v failed with error:%v", trackID, request.URL, getClonedData(request.URL, savedBuf), err) + } else if err = utils.TryUnmarshalUseNumber(bodyData, &bodyMap); err != nil { + baseapi.SugarLogger.Errorf("AccessPlatformAPIWithRetry:%s url:%v, request:%v failed with error:%v, bodyData:%s", trackID, request.URL, getClonedData(request.URL, savedBuf), err, string(bodyData)) + } + + if err != nil { + errLevel = ErrLevelRecoverableErr // 读取数据错误,或数据格式错误认为是偶发情况,重试 } else { errLevel, err = handleResponse(bodyMap) } diff --git a/utils/typeconv.go b/utils/typeconv.go index 9d87b998..4aaaf4f8 100644 --- a/utils/typeconv.go +++ b/utils/typeconv.go @@ -4,8 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" - "net/http" "net/url" "reflect" "strconv" @@ -33,15 +31,19 @@ func GetConcretValue(value reflect.Value) reflect.Value { } func UnmarshalUseNumber(data []byte, result interface{}) error { - d := json.NewDecoder(bytes.NewReader(data)) - d.UseNumber() - err := d.Decode(result) + err := TryUnmarshalUseNumber(data, result) if err != nil { baseapi.SugarLogger.Infof("decode data:%v, error:%v", string(data), err) } return err } +func TryUnmarshalUseNumber(data []byte, result interface{}) error { + d := json.NewDecoder(bytes.NewReader(data)) + d.UseNumber() + return d.Decode(result) +} + // 这个函数将解析json,返回的map中的字段类型与structObj中的完全一样的 func Unmarshal2Map(data []byte, structObj interface{}) (resultMap map[string]interface{}, err error) { if err = json.Unmarshal(data, structObj); err == nil { @@ -287,20 +289,6 @@ func IsTimeZero(timeValue time.Time) bool { return timeValue == DefaultTimeValue || timeValue == ZeroTimeValue } -func HTTPResponse2Json(response *http.Response) (map[string]interface{}, error) { - var jsonResult map[string]interface{} - bodyData, err := ioutil.ReadAll(response.Body) - if err != nil { - // baseapi.SugarLogger.Errorf("ioutil.ReadAll error:%v, response:%v", err, response) - return nil, err - } - - if err = UnmarshalUseNumber(bodyData, &jsonResult); err != nil { - return nil, err - } - return jsonResult, nil -} - func HTTPBody2Values(data []byte, needDecode bool) (url.Values, error) { bodyStr := string(data) if needDecode {