#actix-web #validation #interface #request #automatic #error #applications

actix-web-validation

为actix-web应用提供的通用验证接口

8个版本 (4个破坏性更新)

新功能 0.5.1 2024年8月22日
0.5.0 2024年8月13日
0.4.1 2024年8月10日
0.3.0 2024年7月13日
0.1.1 2024年7月6日

#676 in 解析实现

Download history 301/week @ 2024-07-04 118/week @ 2024-07-11 14/week @ 2024-07-18 42/week @ 2024-07-25 142/week @ 2024-08-01 314/week @ 2024-08-08 172/week @ 2024-08-15

每月676次下载

MIT许可

41KB
819

Actix Web Validation

tests crates.io docs.rs MSRV

actix-web的请求验证。

支持的验证库

用法

任何实现了Actix FromRequest 特性的类型都可以自动进行验证。

# Cargo.toml
actix-web-validation = { version = "0.0.0", features = ["validator"] }
# or 
actix-web-validation = { version = "0.0.0", features = ["garde"] }
# or 
actix-web-validation = { version = "0.0.0", features = ["custom"] }
use actix_web_validation::Validated;

// Do validation using your validation library
#[derive(Debug, Validate, Deserialize)]
struct Example {
    #[validate(length(min = 3))]
    name: String,
}

// Wrap your Actix extractor with `Validated` to automatically run validation
#[post("/")]
async fn hello(Validated(Json(payload)): Validated<Json<Example>>) -> impl Responder {
    HttpResponse::Ok().body(format!("Hello {}", payload.name))
}

自定义错误

通过提供错误处理器可以实现自定义错误响应。

以下是一个自定义错误响应的示例,它以JSON格式响应

#[derive(Debug, Serialize, Error)]
struct CustomErrorResponse {
    custom_message: String,
    errors: Vec<String>,
}

impl ResponseError for CustomErrorResponse {
    fn status_code(&self) -> actix_web::http::StatusCode {
        actix_web::http::StatusCode::BAD_REQUEST
    }

    fn error_response(&self) -> HttpResponse<actix_web::body::BoxBody> {
        HttpResponse::build(self.status_code()).body(serde_json::to_string(self).unwrap())
    }
}

以下是一个 validator 包的示例

fn error_handler(errors: ::validator::ValidationErrors, req: &HttpRequest) -> actix_web::Error {
    CustomErrorResponse {
        custom_message: "My custom message".to_string(),
        errors: errors
            .errors()
            .iter()
            .map(|(err, _)| err.to_string())
            .collect(),
    }
    .into()
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .validator_error_handler(Arc::new(error_handler))
            // ....
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

以下是一个 garde 包的示例

fn error_handler(errors: ::garde::Report, req: &HttpRequest) -> actix_web::Error {
    CustomErrorResponse {
        custom_message: "My custom message".to_string(),
        errors: errors.iter().map(|(_, err)| err.to_string()).collect(),
    }
    .into()
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .garde_error_handler(Arc::new(error_handler))
            // ....
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

动机

此库受到了Spring Validationactix-web-validator 的极大启发。

actix-web-validator 非常好,但我希望通过此库解决一些痛点。

  • 通过使用 Validated 提取器进行更明确的验证,以减少错误地使用错误的 Json/Query 等提取器的风险。
  • 提供可以随着Rust生态系统的发展而扩展的验证库的通用接口。

限制

由于Rust处理重叠特征实现的方式,actix_web_validation::Validated 只能在启用1个功能标志时使用。这可能不会影响大多数用例,因为大多数应用程序将只使用一个验证库来处理所有事情。如果您需要同时使用多个验证库,此库仍然可以使用,但您需要完全限定导入,如 actix_web_validation::validator::Validatedactix_web_validation::garde::Validated,和 actix_web_validation::custom::Validated

依赖项

~14–25MB
~458K SLoC