validator.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package httpclent
  2. import (
  3. "errors"
  4. "sync"
  5. "github.com/tidwall/gjson"
  6. )
  7. // 如果不符合则返回异常
  8. type ValidatorResponseBodyFunc func(body []byte) (err error)
  9. var (
  10. defaultValidatorResponseBodyChain = []ValidatorResponseBodyFunc{validatorErrorMessage, validatorCodeDataMessage}
  11. // 通过key去过滤 func
  12. validatorResponseBodyChainFilterMap = map[string]ValidatorResponseBodyFunc{
  13. "error.message": validatorErrorMessage,
  14. "code.data.message": validatorCodeDataMessage,
  15. }
  16. validatorLock sync.RWMutex
  17. )
  18. func CheckResponseBodyHasError(body []byte) error {
  19. validatorLock.RLock()
  20. defer validatorLock.RUnlock()
  21. for _, elem := range defaultValidatorResponseBodyChain {
  22. if err := elem(body); err != nil {
  23. return err
  24. }
  25. }
  26. return nil
  27. }
  28. /**
  29. 这个最好Main方法中调用一次
  30. */
  31. func AddValidatorResponseBody(key string, fun ValidatorResponseBodyFunc) {
  32. if key == "" || fun == nil {
  33. return
  34. }
  35. validatorLock.Lock()
  36. defer validatorLock.Unlock()
  37. _, isExist := validatorResponseBodyChainFilterMap[key]
  38. if isExist {
  39. return
  40. }
  41. validatorResponseBodyChainFilterMap[key] = fun
  42. defaultValidatorResponseBodyChain = append(defaultValidatorResponseBodyChain, fun)
  43. }
  44. var (
  45. /**
  46. 抓取这种格式的error.message
  47. {
  48. "error": {
  49. "message": ""
  50. }
  51. }
  52. */
  53. validatorErrorMessage ValidatorResponseBodyFunc = func(body []byte) (err error) {
  54. state := gjson.GetBytes(body, "error.message")
  55. if state.Exists() {
  56. return errors.New(state.String())
  57. }
  58. return nil
  59. }
  60. /**
  61. // code 不为0抓取message
  62. {
  63. "code": -1,
  64. "data": null,
  65. "message": "请求参数异常"
  66. }
  67. */
  68. validatorCodeDataMessage ValidatorResponseBodyFunc = func(body []byte) (err error) {
  69. code := gjson.GetBytes(body, "code")
  70. if code.Exists() && code.Int() != 0 {
  71. msg := gjson.GetBytes(body, "message")
  72. if msg.Exists() {
  73. return errors.New(msg.String())
  74. }
  75. }
  76. return nil
  77. }
  78. )