Как выполнить проверку типа параметра в 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
}
Другие вопросы по тегам