Salvo 0.16.5 发布,Rust Web 后端

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

失业的程序员

失业的程序员

沈逸 / 2014-5-1 / 39.00元

这是一个程序员从失业到自行创业的奋斗历程,虽然囧事连连、过程曲折,却充满了趣味。本书以作者的真实创业经历为主线,文字幽默诙谐,情节生动真实,包括了招聘、团队管理和用户公关,以及技术架构设计、核心代码编写、商务谈判、项目运作等场景经验。 从初期的创业伙伴、领路人,到商业竞争对手,各种复杂的关系在各个关键时刻却都发生了意想不到的逆转。在历经千辛万苦,眼看快要成功时,主人公却几乎再次失业。 ......一起来看看 《失业的程序员》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具