salvo 0.6.5

A simple web framework
docs.rs failed to build salvo-0.6.5
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: salvo-0.67.0

build status build status build status codecov crates.io Download License

🎯 功能

  • 基于最新版本的 hyper, tokio;
  • 支持 Websocket;
  • 支持从多个本地目录映射成一个虚拟目录提供服务;
  • 中间件系统支持在句柄之前或者之后运行;
  • 简单易用的路由系统:
    • 路径参数和和支持正则表达式;
    • 树状路由系统;

⚡️ 快速开始

你可以从这里查看实例代码, 或者从这里查看文档。

创建一个全新的项目:

cargo new hello_salvo --bin

添加依赖项到 Cargo.toml

[dependencies]
salvo = "0.4"
tokio = { version = "1.1", features = ["full"] }

main.rs 中创建一个简单的函数句柄, 命名为hello_world, 这个函数只是简单地打印文本 "Hello World".

use salvo::prelude::*;

#[fn_handler]
async fn hello_world(_req: &mut Request, _depot: &mut Depot, res: &mut Response) {
    res.render_plain_text("Hello World");
}

main 函数中, 我们需要首先创建一个根路由, 然后创建一个 Server 并且调用它的 bind 函数:

use salvo::prelude::*;

#[fn_handler]
async fn hello_world(res: &mut Response) {
    res.render_plain_text("Hello World");
}

#[tokio::main]
async fn main() {
    let router = Router::new().get(hello_world);
    let server = Server::new(router);
    server.bind(([0, 0, 0, 0], 7878)).await;
}

树状路由系统

use salvo::prelude::*;

#[tokio::main]
async fn main() {
    let router = Router::new()
        .get(index)
        .push(
            Router::new()
                .path("users")
                .before(auth)
                .post(create_user)
                .push(Router::new().path(r"<id:/\d+/>").post(update_user).delete(delete_user)),
        )
        .push(
            Router::new()
                .path("users")
                .get(list_users)
                .push(Router::new().path(r"<id:/\d+/>").get(show_user)),
        );

    Server::new(router).bind(([0, 0, 0, 0], 7878)).await;
}

#[fn_handler]
async fn index(res: &mut Response) {
    res.render_plain_text("Hello world!");
}
#[fn_handler]
async fn auth(res: &mut Response) {
    res.render_plain_text("user has authed\n\n");
}
#[fn_handler]
async fn list_users(res: &mut Response) {
    res.render_plain_text("list users");
}
#[fn_handler]
async fn show_user(res: &mut Response) {
    res.render_plain_text("show user");
}
#[fn_handler]
async fn create_user(res: &mut Response) {
    res.render_plain_text("user created");
}
#[fn_handler]
async fn update_user(res: &mut Response) {
    res.render_plain_text("user updated");
}
#[fn_handler]
async fn delete_user(res: &mut Response) {
    res.render_plain_text("user deleted");
}

☕ 支持者

Salvo是一个开源项目,如果想支持本项目, 可以 ☕ 在这里买一杯咖啡.

⚠️ 开源协议

Salvo 项目采用 MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)