requests.go 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Package requests 处理请求数据和表单验证逻辑
  2. package requests
  3. import (
  4. "github.com/gin-gonic/gin"
  5. "github.com/thedevsaddam/govalidator"
  6. "github.com/runningwater/gohub/pkg/response"
  7. )
  8. // ValidatorFunc 定义验证函数类型
  9. // 该函数接受一个数据和一个上下文参数,并返回一个包含错误信息的映射
  10. type ValidatorFunc func(any, *gin.Context) map[string][]string
  11. // Validate 函数用于验证请求数据
  12. // 它接受一个上下文对象、要验证的数据和一个验证函数
  13. // 如果验证成功,返回 true;否则返回 false,并在上下文中设置错误响应
  14. // c: gin.Context 上下文对象
  15. // obj: 需要验证的数据对象
  16. // handler: 自定义验证函数
  17. // 返回值是一个布尔值,表示验证是否成功 如果验证失败,返回错误信息,否则返回空映射
  18. // 调用示例:
  19. //
  20. // if ok := requests.Validate(c, &requests.SignupRequest{}, requests.Signup); !ok {
  21. // return
  22. // }
  23. func Validate(c *gin.Context, obj any, handler ValidatorFunc) bool {
  24. // 1. 解析请求, 支持 JSON 数据、表单请求和 URL Query 参数
  25. if err := c.ShouldBind(obj); err != nil {
  26. response.BadRequest(c, err, "请求解析错误,请确认请求格式是否正确。上传文件请使用 multipart 标头, 参数请使用 JSON 格式")
  27. // c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
  28. // "message": "请求解析错误,请确认请求格式是否正确。上传文件请使用 multipart 标头, 参数请使用 JSON 格式",
  29. // "error": err.Error(),
  30. // })
  31. return false
  32. }
  33. // 2. 执行验证
  34. errs := handler(obj, c)
  35. // 3. 如果验证失败,返回错误信息
  36. if len(errs) > 0 {
  37. // c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
  38. // "message": "请求验证不通过,具体请查看 errors",
  39. // "errors": errs,
  40. // })
  41. response.ValidationError(c, errs)
  42. return false
  43. }
  44. // 4. 返回验证成功
  45. return true
  46. }
  47. // validate 函数用于执行数据验证
  48. //
  49. // 它接受数据、验证规则和自定义错误信息,并返回验证结果
  50. // data: 需要验证的数据
  51. // rules: 验证规则
  52. // messages: 自定义错误信息
  53. // 返回值是一个映射,包含字段名和对应的错误信息
  54. func validate(data any, rules, messages govalidator.MapData) map[string][]string {
  55. opts := govalidator.Options{
  56. Data: data,
  57. Rules: rules,
  58. TagIdentifier: "valid", // 使用结构体中的valid标签
  59. Messages: messages,
  60. }
  61. return govalidator.New(opts).ValidateStruct()
  62. }
  63. // validateFile 函数用于验证文件上传
  64. //
  65. // 它接受上下文对象、数据、验证规则和自定义错误信息,并返回验证结果
  66. // c: gin.Context 上下文对象
  67. // data: 需要验证的数据
  68. // rules: 验证规则
  69. // messages: 自定义错误信息
  70. // 返回值是一个映射,包含字段名和对应的错误信息
  71. func validateFile(c *gin.Context, data any, rules, messages govalidator.MapData) map[string][]string {
  72. opts := govalidator.Options{
  73. Request: c.Request,
  74. Rules: rules,
  75. TagIdentifier: "valid", // 使用结构体中的valid标签
  76. Messages: messages,
  77. }
  78. return govalidator.New(opts).Validate()
  79. }