#validation #rocket #json #data #validate-json

rocket-validation

Rocket 守卫以支持使用验证器进行验证

5 个版本

0.2.0 2024年2月13日
0.1.4 2024年2月13日
0.1.3 2022年10月3日
0.1.2 2022年7月28日
0.1.0 2022年3月20日

#9 in #validate-json

Download history 45/week @ 2024-03-13 12/week @ 2024-03-20 35/week @ 2024-03-27 44/week @ 2024-04-03 30/week @ 2024-04-10 35/week @ 2024-04-17 65/week @ 2024-04-24 36/week @ 2024-05-01 83/week @ 2024-05-08 74/week @ 2024-05-15 67/week @ 2024-05-22 36/week @ 2024-05-29 73/week @ 2024-06-05 64/week @ 2024-06-12 108/week @ 2024-06-19 153/week @ 2024-06-26

每月405次下载
3 个包中使用 (通过 open-stock)

MIT 许可证

19KB
121

Rocket 验证

欢迎来到 Rocket 验证包。如果您想使用 Rocket 验证 Json、表单或查询结构体,您来对地方了!

原因

Rocket 使用 Rust 强大的类型系统。这很棒,因为您可以确信这就是您想要的。但这是吗?Kebab-case 字符串或电话号码输入,这并不是真正的类型。您可以为包装类型实现自定义反序列化器,或者在端点调用时编写自定义逻辑来验证它,这很可能导致错误,而且不便于使用,并且不能返回有意义的上下文错误。

如果您来自 TypeScript,您可能听说过 class-validator,这是一个简单、声明式的库,可以集成到中间件中。使用 validator,这个包通过使用 Rocket 的 守卫 机制实现了类似的结果。

任何实现 JsonFromRequestFromForm 以及 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])
}

由于内部火箭限制,目前仅限于使用 JsonFromData 验证

依赖关系

~19–51MB
~889K SLoC