Как выполнить проверку типа параметра в golang gin с помощью валидатора?
У меня есть структура Validator, подобная этой
type UploadFileFormValidator struct {
File []*multipart.FileHeader `form:"File" binding:"required,min=1"`
InputKey string `form:"Key" binding:"disallowed-char"`
Permission string `form:"Permission" binding:"disallowed-permission"`
}
и используя его, как показано ниже
func Bind(c *gin.Context, obj interface{}) error {
b := binding.Default(c.Request.Method, c.ContentType())
return c.ShouldBindWith(obj, b)
}
и форматировать мои ошибки следующим образом
func NewValidatorError(err error) CommonError {
res := CommonError{}
res.Errors = make(map[string]interface{})
errs := err.(validator.ValidationErrors)
for _, v := range errs {
if v.Param() != "" {
res.Errors[v.Field()] = fmt.Sprintf("{%v: %v}", v.Tag(), v.Param())
} else {
res.Errors[v.Field()] = fmt.Sprintf("{key: %v}", v.Tag())
}
}
return res
}
Но проблема в том, что когда я загружаю файл в
InputKey
или
Permission
поля я не получу
validator.ValidationErrors
как и ожидалось.
Это похоже на то, что джин рассматривает эту ситуацию как какие-то другие ошибки.
Как я могу выполнить проверку типа параметра и при этом использовать исходную структуру кода?
1 ответ
но проблема в том, что когда я загружаю файл в поле InputKey или Permission, я не получаю validator.ValidationErrors, как я и ожидал
Вы не получите
validator
ошибка в этом случае. Что не удается, так это привязка в целом. Шаг проверки вообще не достигнут.
Вы должны убедиться, что поля модели правильно сопоставляются с запросом (формой запроса или сообщения, учитывая, что вы используете
form
привязка), т. е. привязка Gin может устанавливать поля структуры для начала. Затем будет проведена проверка и, возможно,
validator.ValidationErrors
.
Просто чтобы было ясно, это то, что реализация
queryBinding
похоже:
func (queryBinding) Bind(req *http.Request, obj interface{}) error {
values := req.URL.Query()
if err := mapForm(obj, values); err != nil {
return err // you get stuck here
}
return validate(obj)
}
Как видите, отображение модели происходит до проверки.
К сожалению, ошибки сопоставления неспецифичны, поэтому вы не можете эффективно использовать
errors.As
поймать это. Что вы можете сделать, так это использовать запятую-ок при подтверждении ошибки проверки, и если это не удается, вы знаете, что это проблема привязки.
errs, ok := err.(validator.ValidationErrors)
if !ok {
// binding error
}