requests.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Package requests 处理请求数据和表单验证逻辑
  2. package requests
  3. import (
  4. "net/http"
  5. "github.com/gin-gonic/gin"
  6. "github.com/thedevsaddam/govalidator"
  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. // if ok := requests.Validate(c, &requests.SignupRequest{}, requests.Signup); !ok {
  20. // return
  21. // }
  22. func Validate(c *gin.Context, obj any, handler ValidatorFunc) bool {
  23. // 1. 解析请求, 支持 JSON 数据、表单请求和 URL Query 参数
  24. if err := c.ShouldBind(obj); err != nil {
  25. c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
  26. "message": "请求解析错误,请确认请求格式是否正确。上传文件请使用 multipart 标头, 参数请使用 JSON 格式",
  27. "error": err.Error(),
  28. })
  29. return false
  30. }
  31. // 2. 执行验证
  32. errs := handler(obj, c)
  33. // 3. 如果验证失败,返回错误信息
  34. if len(errs) > 0 {
  35. c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
  36. "message": "请求验证不通过,具体请查看 errors",
  37. "errors": errs,
  38. })
  39. return false
  40. }
  41. // 4. 返回验证成功
  42. return true
  43. }
  44. // validate 函数用于执行数据验证
  45. // 它接受数据、验证规则和自定义错误信息,并返回验证结果
  46. // data: 需要验证的数据
  47. // rules: 验证规则
  48. // messages: 自定义错误信息
  49. // 返回值是一个映射,包含字段名和对应的错误信息
  50. func validate(data any, rules, messages govalidator.MapData) map[string][]string {
  51. opts := govalidator.Options{
  52. Data: data,
  53. Rules: rules,
  54. TagIdentifier: "valid", // 使用结构体中的valid标签
  55. Messages: messages,
  56. }
  57. return govalidator.New(opts).ValidateStruct()
  58. }