Rust 中的数据验证:库与方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust 中的数据验证:库与实用方法概览



在现代 Rust 开发中,尤其是在构建 Web 服务和 API 时,输入数据的验证是一项至关重要的任务。Rust 语言本身已经提供了强大的类型系统,能在编译阶段消除整类错误。然而,对于业务逻辑的检查(例如,密码最小长度、邮箱格式正确性、数字范围),还需要额外的工具。在本文中,我们将介绍 Rust 中三种最流行的数据验证库:validator、garde 和 valitron。



1. validator 库



validator 可以说是 Rust 中最著名且最成熟的用于结构体验证的库。它基于属性(derive macros)构建,并支持大量内置规则。



安装:

[dependencies]validator = { version = "0.18", features = ["derive"] }


使用示例:

use validator::Validate;

#[derive(Debug, Validate)]struct User { #[validate(length(min = 3, max = 20))] username: String,

#[validate(email)] email: String,

#[validate(range(min = 18, max = 120))] age: u32,

#[validate(required)] password: Option<String>,}

fn main() { let user = User { username: "Jo".to_string(), email: "invalid-email".to_string(), age: 15, password: None, };

match user.validate() { Ok(_) => println!("验证通过!"), Err(errors) => { for (field, err) in &errors.errors() { println!("字段 '{}' 中的错误:{:?}", field, err); } } }}


优点:

  • 大量内置验证器:email、URL、长度、范围、正则表达式。
  • 通过 custom 属性支持自定义验证函数。
  • 与 Web 框架(Actix-web、Axum、Rocket)集成良好。


缺点:

  • 依赖宏,可能会减慢编译速度。
  • 错误以 HashMap 形式返回,需要额外处理才能用于 API。


2. garde 库



garde 是 validator 的一个更现代、更快速的替代方案。它也使用 derive 宏,但提供了更灵活的 API 和更好的性能。



安装:

[dependencies]garde = "0.20"


使用示例:

use garde::Validate;

#[derive(Debug, Validate)]struct LoginRequest { #[garde(length(min = 3, max = 50))] username: String,

#[garde(ascii, length(min = 8))] password: String,

#[garde(skip)] remember_me: bool,}

fn main() { let req = LoginRequest { username: "ab".to_string(), password: "1234567".to_string(), remember_me: true, };

if let Err(errors) = req.validate() { for error in &errors { println!("错误:{} - {}", error.path(), error.message()); } } else { println!("验证成功!"); }}


优点:

  • 由于代码优化,性能高。
  • 清晰的错误消息,包含字段路径。
  • 支持嵌套结构和集合。
  • 无需宏即可创建自定义规则。


缺点:

  • 内置验证器较少(默认没有 email、URL)。
  • 社区比 validator 小。


3. valitron 库



valitron 是一个轻量级库,它不使用

推荐