处理器
概述
在Silent框架中,处理器(Handler)是处理HTTP请求并生成响应的核心组件。处理器负责接收请求对象,执行业务逻辑,并返回响应结果。
Handler特征
#[async_trait]
pub trait Handler: Send + Sync + 'static {
async fn call(&self, req: Request) -> Result<Response>;
}Handler特征定义了处理器的基本接口:
call方法接收一个Request对象作为参数返回一个包含
Response的Result处理器必须是线程安全的(实现
Send + Sync)处理器必须有'static生命周期
Handler特征在Silent框架中扮演着重要角色:
作为中间件链的终点,负责生成最终响应
Next结构体也实现了Handler特征,使其能够作为请求处理链的一部分
通过Arc智能指针包装,实现在中间件链中的共享和传递
内置处理器
Silent框架提供了几种常用的内置处理器:
静态文件处理器
用于提供静态文件服务:
use silent::prelude::*;
let route = Route::new("static")
.get(StaticFileHandler::new("static_files"));函数处理器
可以将异步函数转换为处理器:
use silent::prelude::*;
async fn hello(_req: Request) -> Result<Response> {
Ok(Response::text("Hello World!"))
}
let route = Route::new("").get(hello);自定义处理器
您可以通过实现Handler特征来创建自定义处理器:
use silent::prelude::*;
pub struct CustomHandler;
#[async_trait]
impl Handler for CustomHandler {
async fn call(&self, req: Request) -> Result<Response> {
// 处理请求逻辑
let body = format!("Received request: {} {}", req.method(), req.uri());
Ok(Response::text(body))
}
}
// 使用自定义处理器
let route = Route::new("").get(CustomHandler);处理器组合
处理器可以与中间件组合使用,形成完整的请求处理链:
let route = Route::new("")
.middleware(Logger) // 添加日志中间件
.middleware(Auth) // 添加认证中间件
.get(CustomHandler); // 处理器处理器作为请求处理链的终点,负责生成最终的响应。中间件可以在处理器执行前后添加额外的处理逻辑,例如日志记录、认证授权等。
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_my_handler() {
let handler = MyHandler;
let req = Request::default();
let resp = handler.call(req).await.unwrap();
assert_eq!(resp.status(), 200);
}
}通过合理使用处理器,您可以构建出结构清晰、易于维护的Web应用程序。处理器提供了一种优雅的方式来组织请求处理逻辑,使代码更加模块化和可测试。
Last updated
Was this helpful?