Почему проверки Rocket не выполняются в Json?

У меня есть следующий код, в котором я использую проверки Rocket:

#[derive(Debug, Deserialize, FromForm)]
pub struct CreateUserDto<'r> {
    #[field(validate = email_validation())]
    email: &'r str,
    password: &'r str,
}

fn email_validation(email: &str) -> Result<()> {
    let re: Regex = Regex::new(r"^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$").unwrap();

    if !re.is_match(email) {
        Err(Error::validation("invalid email address"))?;
    }

    Ok(())
}

В этом коде я пытаюсь проверить поле электронной почты в соответствии с заданным регулярным выражением. По какой-то причине функция email_validation никогда не вызывается.

Есть идеи, почему? Я следовал документации Rocket, как показано здесь: https://api.rocket.rs/master/rocket/form/validate/#custom-validation

Я также попытался добавить встроенную проверку:

#[derive(Debug, Deserialize, FromForm)]
pub struct CreateUserDto<'r> {
    #[field(validate = range(2..10))]
    id: usize,
    #[field(validate = email_validation())]
    pub email: &'r str,
    pub password: &'r str,
}

И вот конечная точка:

#[post("/", data = "<input>")]
fn creart_user(input: Json<CreateUserDto>) {
    let user = input.into_inner();
    println!("email {0}, password: {1}", user.email, user.password);
}

В обоих случаях проверка не сработала.

Обновление 1:

Кажется, что проверки работают, когда применяется Form:

#[post("/", data = "<input>")]
fn creart_user(input: Form<CreateUserDto>) {
    let user = input.into_inner();
    println!("email {0}, password: {1}", user.email, user.password);
}

Есть идеи, как его запустить на Json?

отладка и отправка недопустимого значения: vvv.com (вместо [email protected]

vlio20 24.03.2024 17:19

Использование регулярного выражения для проверки адреса электронной почты всегда подвержено ошибкам.

Daniel A. White 24.03.2024 18:11

Я также пытался создать другой валидатор, который не удался ни на одном входе.

vlio20 24.03.2024 18:14

примеры не полные. Но самый основной не работает :/

vlio20 24.03.2024 20:26

Похоже, что валидаторы работают не на Json, а только на Form. См. обновленный вопрос.

vlio20 24.03.2024 20:29
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
5
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Rocket реализует проверку только для форм. Насколько я могу судить, нет способа запустить проверку для других типов.

Однако вы можете использовать другой ящик проверки. Валидатор кажется самым популярным вариантом, и существует ракетная валидация, которая обеспечивает rocket защиту validator.

Другие вопросы по теме