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 } )