什么是 validator?
validator 是 Rust 中一种流行的数据验证库,提供简单且富有表现力的方式来检查输入数据的正确性。它基于宏和注解,允许直接在数据结构中描述验证规则。该库支持诸如字符串长度、数字范围、正则表达式、必填字段和自定义验证器等检查。
为什么需要验证?
在任何处理外部数据(用户输入、API 请求、配置文件)的应用程序中,在处理这些数据之前检查其正确性至关重要。验证错误可能导致程序崩溃、安全漏洞或逻辑不正确。validator 允许集中描述规则,自动生成清晰易懂的错误消息,并避免样板代码。
安装
在 Cargo.toml 中添加:
[dependencies]validator = { version = "0.16", features = ["derive"] }serde = { version = "1.0", features = ["derive"] }它也常与 serde 一起用于数据反序列化。
主要功能
- 验证属性:
#[validate(length(min = 1, max = 100))]、#[validate(range(min = 18, max = 99))]、#[validate(email)]、#[validate(regex = "...")]等。 - 自定义验证器:通过属性
#[validate(custom = "my_function")]。 - 嵌套验证:适用于包含其他结构体的结构体。
- 错误分组:返回
ValidationErrors,并按字段提供详细信息。
Rust 代码示例
use validator::Validate;use serde::Deserialize;
#[derive(Debug, Deserialize, Validate)]struct User { #[validate(length(min = 2, max = 50))] name: String,
#[validate(email)] email: String,
#[validate(range(min = 18, max = 120))] age: u8,
#[validate(required)] #[validate(length(min = 8))] password: Option<String>,}
fn main() { let user = User { name: "A".to_string(), // 太短 email: "invalid".to_string(), age: 15, password: Some("123".to_string()), };
match user.validate() { Ok(_) => println!("数据有效"), Err(errors) => { for (field, err_list) in errors.field_errors() { println!("字段 '{}' 有错误:", field); for err in err_list { println!(" - {}", err.message.as_ref().unwrap_or(&"未知错误".to_string())); } } } }}何时使用 validator?
- 在创建 REST API(例如,使用 Actix-web、Axum、Rocket)时,用于验证传入的 JSON 请求。
- 在 CLI 应用程序中,用于验证命令行参数。
- 在处理服务器端表单时。
- 在任何需要以最少代码进行声明式数据检查的地方。
该库非常适合注重代码安全性和可读性的项目。它受到积极维护,并在 Rust 生态系统中被广泛使用。