5 个版本
0.2.0 | 2024年2月13日 |
---|---|
0.1.4 |
|
0.1.3 | 2022年10月3日 |
0.1.2 | 2022年7月28日 |
0.1.0 | 2022年3月20日 |
#9 in #validate-json
每月405次下载
在 3 个包中使用 (通过 open-stock)
19KB
121 行
Rocket 验证
欢迎来到 Rocket 验证包。如果您想使用 Rocket 验证 Json、表单或查询结构体,您来对地方了!
原因
Rocket 使用 Rust 强大的类型系统。这很棒,因为您可以确信这就是您想要的。但这是吗?Kebab-case 字符串或电话号码输入,这并不是真正的类型。您可以为包装类型实现自定义反序列化器,或者在端点调用时编写自定义逻辑来验证它,这很可能导致错误,而且不便于使用,并且不能返回有意义的上下文错误。
如果您来自 TypeScript,您可能听说过 class-validator,这是一个简单、声明式的库,可以集成到中间件中。使用 validator,这个包通过使用 Rocket 的 守卫 机制实现了类似的结果。
任何实现 Json、FromRequest 或 FromForm 以及
Validate
的类型,都可以使用该包的Validated
守卫,因此您可以确保在处理程序中接收到数据时数据已被验证。
使用 Rocket 的 错误处理器,您可以将验证过程中发生的错误路由到用户。
当前 Rocket 的验证:Rocket 为 FromForm 结构体提供了验证,但其他什么都没有。
用法
为了开始,您需要依赖 rocket-validation
。将其添加到您的 Cargo.toml
[dependencies]
rocket-validation = "0.1.3"
validator="?"
validator
是必需的,因为该包的 derive 宏生成的代码依赖于它在全局作用域中可用
现在您可以继续并实现您的验证
// Because we use rocket....
#[macro_use]
extern crate rocket;
// Some types for Json types
use rocket::serde::{json::Json, Deserialize, Serialize};
// Will be important for validation....
use rocket_validation::{Validate, Validated};
#[derive(Debug, Deserialize, Serialize, Validate)] // Implements `Validate`
#[serde(crate = "rocket::serde")]
pub struct HelloData {
#[validate(length(min = 1))] // Your validation annotation
name: String,
#[validate(range(min = 0, max = 100))] // Your validation annotation
age: u8,
}
#[post("/hello", format = "application/json", data = "<data>")]
fn validated_hello(data: /*Uses the `Validated` type*/ Validated<Json<HelloData>>) -> Json<HelloData> {
Json(data.into_inner())
}
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", routes![validated_hello])
}
向客户端暴露错误
在您使用以下内容之前,您应该了解您向客户端暴露了哪些错误,以及这对安全意味着什么。
如果您想以一些自定义消息响应无效请求,您可以实现 validation_catcher
处理器来完成此操作。
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", routes![validated_hello])
.register("/", catchers![rocket_validation::validation_catcher])
}
由于内部火箭限制,目前仅限于使用
Json
或FromData
验证
依赖关系
~19–51MB
~889K SLoC