Salvo 0.16.5 发布,Rust Web 后端

栏目: 软件资讯 · 发布时间: 3年前

内容简介:Salvo 是一个极其简单易用却又功能强大的 Rust Web 后端框架. 仅仅需要基本的 Rust 基础即可写成功能强大的后端服务器, 我们的目标是: 编码最简单, 功能不缺失, 性能有保障. 主要更新功能: 1. BasicAuthValidator...

Salvo 是一个极其简单易用却又功能强大的 Rust Web 后端框架. 仅仅需要基本的 Rust 基础即可写成功能强大的后端服务器, 我们的目标是: 编码最简单, 功能不缺失, 性能有保障.

主要更新功能:

1. BasicAuthValidator 中的 validate 改成了异步.

2. Rustls 和 Native Tls 的支持, 已经证书的热加载.

3. 改进插件系统.

4. 改进 Server 对应的功能.

Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端 Salvo 0.16.5 发布,Rust Web 后端

 

???? 功能特色

  • 基于hyper, tokio 的异步 Web 后端框架;
  • 支持 Websocket;
  • 统一的中间件和句柄接口, 中间件系统支持在句柄之前或者之后运行;
  • 简单易用的路由系统, 支持路由嵌套, 在任何嵌套层都可以添加中间件;
  • 集成 multipart 表单处理, 处理上传文件变得非常简单;
  • 支持从多个本地目录映射成一个虚拟目录提供服务.

⚡️ 快速开始

你可以查看实例代码, 或者访问官网.

创建一个全新的项目:

cargo new hello_salvo --bin

添加依赖项到 Cargo.toml

[dependencies]
salvo = { version = "0.16", features = ["full"] }
tokio = { version = "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");
}

中间件

Salvo 中的中间件其实就是 Handler, 没有其他任何特别之处. 所以书写中间件并不需要像其他某些框架需要掌握泛型关联类型等知识. 只要你会写函数就会写中间件, 就是这么简单!!!

树状路由系统

正常情况下我们是这样写路由的:

Router::with_path("articles").get(list_articles).post(create_article);
Router::with_path("articles/")
    .get(show_article)
    .patch(edit_article)
    .delete(delete_article);

往往查看文章和文章列表是不需要用户登录的, 但是创建, 编辑, 删除文章等需要用户登录认证权限才可以. Salvo 中支持嵌套的路由系统可以很好地满足这种需求. 我们可以把不需要用户登录的路由写到一起:

Router::with_path("articles")
    .get(list_articles)
    .push(Router::with_path("").get(show_article));

然后把需要用户登录的路由写到一起, 并且使用相应的中间件验证用户是否登录:

Router::with_path("articles")
    .hoop(auth_check)
    .post(list_articles)
    .push(Router::with_path("").patch(edit_article).delete(delete_article));

虽然这两个路由都有这同样的 path("articles"), 然而它们依然可以被同时添加到同一个父路由, 所以最后的路由长成了这个样子:

Router::new()
    .push(
        Router::with_path("articles")
            .get(list_articles)
            .push(Router::with_path("").get(show_article)),
    )
    .push(
        Router::with_path("articles")
            .hoop(auth_check)
            .post(list_articles)
            .push(Router::with_path("").patch(edit_article).delete(delete_article)),
    );

匹配了路径中的一个片段, 正常情况下文章的 id 只是一个数字, 这是我们可以使用正则表达式限制 id 的匹配规则, r"id:/\\d+/".

还可以通过 <*> 或者 <**> 匹配所有剩余的路径片段. 为了代码易读性性强些, 也可以添加适合的名字, 让路径语义更清晰, 比如: <**file_path>.

 

文件上传

可以通过 Request 中的 get_file 异步获取上传的文件:

#[fn_handler]
async fn upload(req: &mut Request, res: &mut Response) {
    let file = req.get_file("file").await;
    if let Some(file) = file {
        let dest = format!("temp/{}", file.filename().unwrap_or_else(|| "file".into()));
        if let Err(e) = std::fs::copy(&file.path, Path::new(&dest)) {
            res.set_status_code(StatusCode::INTERNAL_SERVER_ERROR);
        } else {
            res.render_plain_text("Ok");
        }
    } else {
        res.set_status_code(StatusCode::BAD_REQUEST);
    }
}

 

更多示例

您可以从 examples 文件夹下查看更多示例代码, 您可以通过以下命令运行这些示例:

cargo run --example basic_auth

您可以使用任何你想运行的示例名称替代这里的 basic_auth.

这里有一个真实的项目使用了 Salvo:https://github.com/driftluo/myblog.

???? 性能

Benchmark 测试结果可以从这里查看:

https://web-frameworks-benchmark.netlify.app/result?l=rust

https://www.techempower.com/benchmarks/#section=test&runid=1922b097-2d7f-413c-be21-9571c8302734&hw=ph&test=query&l=zik0zj-e6&a=2


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大学程序设计课程与竞赛训练教材

大学程序设计课程与竞赛训练教材

吴永辉、王建德 / 机械工业出版社 / 2013-6 / 69.00

本书每章为一个主题,实验内容安排紧扣大学算法和数学的教学,用程序设计竞赛中的算法和数学试题作为实验试题,将算法和数学的教学与程序设计竞赛的解题训练结合在一起;在思维方式和解题策略的训练方面,以问题驱动和启发式引导为主要方式,培养读者通过编程解决问题的能力。 本书特点: 书中给出的234道试题全部精选自ACM国际大学生程序设计竞赛的世界总决赛以及各大洲赛区现场赛和网络预赛、大学程序设计竞......一起来看看 《大学程序设计课程与竞赛训练教材》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器