pub trait FromRequest: Sized {
type Rejection: Into<Response> + Send + 'static;
// Required method
fn from_request<'life0, 'async_trait>(
req: &'life0 mut Request,
) -> Pin<Box<dyn Future<Output = Result<Self, Self::Rejection>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
}Expand description
FromRequest 是萃取器的核心 trait,用于从 HTTP 请求中提取特定类型的数据。
通过实现这个 trait,您可以创建自定义的萃取器,从请求中提取任何需要的数据。 所有内置萃取器(Path、Query、Json 等)都实现了这个 trait。
§基本用法
要实现一个自定义萃取器,您需要:
- 定义您的数据类型
- 实现
FromRequesttrait - 在处理函数中使用萃取器
§示例:创建 JWT 令牌萃取器
use async_trait::async_trait;
use silent::extractor::FromRequest;
use silent::{Request, Result, SilentError};
struct JwtToken(String);
#[async_trait]
impl FromRequest for JwtToken {
type Rejection = SilentError;
async fn from_request(req: &mut Request) -> std::result::Result<Self, Self::Rejection> {
let token = req.headers()
.get("authorization")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.strip_prefix("Bearer "))
.map(|s| s.to_string())
.ok_or(SilentError::ParamsNotFound)?;
Ok(JwtToken(token))
}
}
// 使用自定义萃取器
async fn protected_handler(token: JwtToken) -> Result<String> {
Ok(format!("访问受保护的资源,Token: {}", token.0))
}§错误处理
FromRequest 的 Rejection 类型决定了萃取失败时的错误类型。常用的错误类型:
SilentError:框架内置错误,包含ParamsNotFound、ParamsEmpty等Response:直接返回 HTTP 响应
§组合使用
多个萃取器可以组合使用:
use silent::Result;
use silent::extractor::{Path, Query, Json};
use serde::Deserialize;
#[derive(Deserialize)]
struct Page {
page: u32,
size: u32,
}
#[derive(Deserialize)]
struct Data {
name: String,
}
async fn handler(
(Path(id), Query(p), Json(data)): (Path<i64>, Query<Page>, Json<Data>),
) -> Result<String> {
// 处理提取的数据
Ok("成功".to_string())
}§可选参数
使用 Option<T> 可以处理可选参数:
use silent::Result;
use silent::extractor::Path;
async fn handler(opt_id: Option<Path<i64>>) -> Result<String> {
match opt_id {
Some(Path(id)) => Ok(format!("ID: {}", id)),
None => Ok("无ID".to_string()),
}
}Required Associated Types§
Required Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.