- add utils.TryUnmarshalUseNumber
- remove utils.HTTPResponse2Json
This commit is contained in:
@@ -138,10 +138,19 @@ func AccessPlatformAPIWithRetry(client *http.Client, handleRequest func() *http.
|
|||||||
}
|
}
|
||||||
return ErrHTTPCodeIsNot200
|
return ErrHTTPCodeIsNot200
|
||||||
}
|
}
|
||||||
var errLevel string
|
var (
|
||||||
bodyMap, err := utils.HTTPResponse2Json(response)
|
errLevel string
|
||||||
|
bodyMap map[string]interface{}
|
||||||
|
)
|
||||||
|
bodyData, err := ioutil.ReadAll(response.Body)
|
||||||
if err != nil {
|
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 {
|
} else {
|
||||||
errLevel, err = handleResponse(bodyMap)
|
errLevel, err = handleResponse(bodyMap)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -33,15 +31,19 @@ func GetConcretValue(value reflect.Value) reflect.Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func UnmarshalUseNumber(data []byte, result interface{}) error {
|
func UnmarshalUseNumber(data []byte, result interface{}) error {
|
||||||
d := json.NewDecoder(bytes.NewReader(data))
|
err := TryUnmarshalUseNumber(data, result)
|
||||||
d.UseNumber()
|
|
||||||
err := d.Decode(result)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
baseapi.SugarLogger.Infof("decode data:%v, error:%v", string(data), err)
|
baseapi.SugarLogger.Infof("decode data:%v, error:%v", string(data), err)
|
||||||
}
|
}
|
||||||
return 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中的完全一样的
|
// 这个函数将解析json,返回的map中的字段类型与structObj中的完全一样的
|
||||||
func Unmarshal2Map(data []byte, structObj interface{}) (resultMap map[string]interface{}, err error) {
|
func Unmarshal2Map(data []byte, structObj interface{}) (resultMap map[string]interface{}, err error) {
|
||||||
if err = json.Unmarshal(data, structObj); err == nil {
|
if err = json.Unmarshal(data, structObj); err == nil {
|
||||||
@@ -287,20 +289,6 @@ func IsTimeZero(timeValue time.Time) bool {
|
|||||||
return timeValue == DefaultTimeValue || timeValue == ZeroTimeValue
|
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) {
|
func HTTPBody2Values(data []byte, needDecode bool) (url.Values, error) {
|
||||||
bodyStr := string(data)
|
bodyStr := string(data)
|
||||||
if needDecode {
|
if needDecode {
|
||||||
|
|||||||
Reference in New Issue
Block a user