处理器

概述

在Silent框架中,处理器(Handler)是处理HTTP请求并生成响应的核心组件。处理器负责接收请求对象,执行业务逻辑,并返回响应结果。

Handler特征

#[async_trait]
pub trait Handler: Send + Sync + 'static {
    async fn call(&self, req: Request) -> Result<Response>;
}

Handler特征定义了处理器的基本接口:

  • call方法接收一个Request对象作为参数

  • 返回一个包含ResponseResult

  • 处理器必须是线程安全的(实现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?