| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package httpclent
- import (
- "errors"
- "sync"
- "github.com/tidwall/gjson"
- )
- // 如果不符合则返回异常
- type ValidatorResponseBodyFunc func(body []byte) (err error)
- var (
- defaultValidatorResponseBodyChain = []ValidatorResponseBodyFunc{validatorErrorMessage, validatorCodeDataMessage}
- // 通过key去过滤 func
- validatorResponseBodyChainFilterMap = map[string]ValidatorResponseBodyFunc{
- "error.message": validatorErrorMessage,
- "code.data.message": validatorCodeDataMessage,
- }
- validatorLock sync.RWMutex
- )
- func CheckResponseBodyHasError(body []byte) error {
- validatorLock.RLock()
- defer validatorLock.RUnlock()
- for _, elem := range defaultValidatorResponseBodyChain {
- if err := elem(body); err != nil {
- return err
- }
- }
- return nil
- }
- /**
- 这个最好Main方法中调用一次
- */
- func AddValidatorResponseBody(key string, fun ValidatorResponseBodyFunc) {
- if key == "" || fun == nil {
- return
- }
- validatorLock.Lock()
- defer validatorLock.Unlock()
- _, isExist := validatorResponseBodyChainFilterMap[key]
- if isExist {
- return
- }
- validatorResponseBodyChainFilterMap[key] = fun
- defaultValidatorResponseBodyChain = append(defaultValidatorResponseBodyChain, fun)
- }
- var (
- /**
- 抓取这种格式的error.message
- {
- "error": {
- "message": ""
- }
- }
- */
- validatorErrorMessage ValidatorResponseBodyFunc = func(body []byte) (err error) {
- state := gjson.GetBytes(body, "error.message")
- if state.Exists() {
- return errors.New(state.String())
- }
- return nil
- }
- /**
- // code 不为0抓取message
- {
- "code": -1,
- "data": null,
- "message": "请求参数异常"
- }
- */
- validatorCodeDataMessage ValidatorResponseBodyFunc = func(body []byte) (err error) {
- code := gjson.GetBytes(body, "code")
- if code.Exists() && code.Int() != 0 {
- msg := gjson.GetBytes(body, "message")
- if msg.Exists() {
- return errors.New(msg.String())
- }
- }
- return nil
- }
- )
|