< 返回版块

gengteng 发表于 2023-08-01 17:26

这个 crate 提供了一个名为 Valid 的 axum 提取器,可以与 axum 框架的 PathQueryJsonForm 等提取器配合使用,自动调用 validator 库对其内部的对象自动进行合法性校验,也支持对自定义类型的提取器进行校验。

crates.io LICENSE dependency status GitHub Workflow Status Coverage Status

基本使用方法:

cargo add axum-valid
use validator::Validate;
use serde::Deserialize;
use axum_valid::Valid;
use axum::extract::Query;
use axum::Json;

#[derive(Debug, Validate, Deserialize)]
pub struct Pager {
    #[validate(range(min = 1, max = 50))]
    pub page_size: usize,
    #[validate(range(min = 1))]
    pub page_no: usize,
}

pub async fn get_page_by_query(
    Valid(Query(pager)): Valid<Query<Pager>>,
) {
    assert!((1..=50).contains(&pager.page_size));
    assert!((1..).contains(&pager.page_no));
}

pub async fn get_page_by_json(
    Valid(Json(pager)): Valid<Json<Pager>>,
) {
    assert!((1..=50).contains(&pager.page_size));
    assert!((1..).contains(&pager.page_no));
}

// ... 在 axum 的 router 中使用上述两个 handler

更详细具体的使用例子参考项目的 test.rs 文件, 配合自定义 extractor 使用可参考 tests/custom.rs

目前该 crate 已通过 feature 支持更多 extractor:

Feature 描述 是否默认开启 是否有测试代码
default 启用对PathQueryJsonForm的支持
json 启用对Json的支持
query 启用对Query的支持
form 启用对Form的支持
typed_header 启用对TypedHeader的支持
msgpack 启用对axum-msgpack中的MsgPackMsgPackRaw的支持
yaml 启用对axum-yaml中的Yaml的支持
extra 启用对axum-extra中的CachedWithRejection的支持
extra_query 启用对axum-extra中的Query的支持
extra_form 启用对axum-extra中的Form的支持
extra_protobuf 启用对axum-extra中的Protobuf的支持
all_extra_types 启用上述所有axum-extra提取器的支持
all_types 启用上述所有提取器的支持
422 当验证失败时,使用422 Unprocessable Entity而不是400 Bad Request作为状态码
into_json 将验证错误序列化为JSON格式,并作为HTTP正文返回
full 启用所有特性

欢迎提 issue 和 PR。

评论区

写评论
byeblack 2023-08-07 07:19

因为Axum基于hyper,而hyper目前正在稳定1.0,另外tower-http也有不少不足之处,而Actix Web出得最早,除了你说的稳定方便,各种第三方包也很多。所以我选择Axum

--
👇
github.com/shanliu/lsys: 个人感觉 acitx-web 比Axum 方便,而且api跟代码结构也更稳定。

In preparation for axum 0.7 the ...

0.7 跟0.6估计又会不太兼容,目前官方例子都跑不通。。。 感觉还在变来变去的。优势就是tokio的官产版,等到1.0在看吧。

github.com/shanliu/lsys 2023-08-04 20:46

个人感觉 acitx-web 比Axum 方便,而且api跟代码结构也更稳定。

In preparation for axum 0.7 the ...

0.7 跟0.6估计又会不太兼容,目前官方例子都跑不通。。。 感觉还在变来变去的。优势就是tokio的官产版,等到1.0在看吧。

Borber 2023-08-02 09:40

好赞, axum 又添一员大将, 感觉可以自己包一层然后更简洁地使用

1 共 3 条评论, 1 页