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 解析实现
每月676次下载
41KB
819 行
Actix Web Validation
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 Validation 和 actix-web-validator 的极大启发。
actix-web-validator 非常好,但我希望通过此库解决一些痛点。
- 通过使用
Validated
提取器进行更明确的验证,以减少错误地使用错误的Json
/Query
等提取器的风险。 - 提供可以随着Rust生态系统的发展而扩展的验证库的通用接口。
限制
由于Rust处理重叠特征实现的方式,actix_web_validation::Validated
只能在启用1个功能标志时使用。这可能不会影响大多数用例,因为大多数应用程序将只使用一个验证库来处理所有事情。如果您需要同时使用多个验证库,此库仍然可以使用,但您需要完全限定导入,如 actix_web_validation::validator::Validated
, actix_web_validation::garde::Validated
,和 actix_web_validation::custom::Validated
。
依赖项
~14–25MB
~458K SLoC