路由

路由是 Silent 框架的核心功能之一,它负责将 HTTP 请求映射到相应的处理函数。本文将详细介绍 Silent 框架的路由系统。

基本路由

Silent 框架使用 Route 结构体来定义路由。最基本的路由定义包括路径和处理函数:

use silent::prelude::*;

#[handler]
async fn hello() -> &'static str {
    "Hello, world!"
}

let route = Route::new("").get(hello);

HTTP 方法

Silent 支持所有标准的 HTTP 方法:

let route = Route::new("api")
    .get(get_handler)      // GET 请求
    .post(post_handler)    // POST 请求
    .put(put_handler)      // PUT 请求
    .delete(delete_handler); // DELETE 请求

路由参数

你可以在路由路径中使用参数,通过 :参数名 的形式定义:

#[handler]
async fn user_info(req: Request) -> Result<String> {
    let user_id = req.get_path_params::<String>("id")?;
    Ok(format!("User ID: {}", user_id))
}

let route = Route::new("users/<id>").get(user_info);

路由嵌套

Silent 支持路由嵌套,这对于构建 API 版本或模块化路由非常有用:

let api_v1 = Route::new("v1")
    .at(Route::new("users").get(list_users_v1))
    .at(Route::new("posts").get(list_posts_v1));

let api_v2 = Route::new("v2")
    .at(Route::new("users").get(list_users_v2))
    .at(Route::new("posts").get(list_posts_v2));

let api = Route::new("api")
    .at(api_v1)
    .at(api_v2);

路由组

你可以将相关的路由组织在一起,使代码结构更清晰:

let users = Route::new("users")
    .get(list_users)    // GET /users
    .post(create_user)  // POST /users
    .at(Route::new(":id")
        .get(get_user)     // GET /users/:id
        .put(update_user)   // PUT /users/:id
        .delete(delete_user) // DELETE /users/:id
    );

通配符路由

Silent 支持使用通配符来匹配多个路径:

// 匹配所有路径
let route = Route::new("*").get(handler);

// 匹配特定前缀的所有路径
let route = Route::new("api/*").get(handler);

最佳实践

  1. 路由命名要清晰、语义化,反映资源的层级关系

  2. 合理使用路由嵌套,避免过深的嵌套层级

  3. 相关的路由功能要组织在一起

  4. 使用合适的 HTTP 方法来表达操作语义

  5. 路由参数命名要有意义,便于理解

示例

这是一个完整的路由示例,展示了如何组织一个博客系统的 API:

let posts = Route::new("posts")
    .get(list_posts)
    .post(create_post)
    .at(Route::new(":id")
        .get(get_post)
        .put(update_post)
        .delete(delete_post)
        .at(Route::new("comments")
            .get(list_comments)
            .post(create_comment)
        )
    );

let users = Route::new("users")
    .get(list_users)
    .post(create_user)
    .at(Route::new(":id")
        .get(get_user)
        .put(update_user)
        .delete(delete_user)
    );

let api = Route::new("api")
    .at(posts)
    .at(users);

这个示例展示了如何组织一个包含用户和博客文章管理的 API 系统,包括评论功能。路由结构清晰,易于维护和扩展。

Last updated

Was this helpful?