内容简介:Salvo 是一个极其简单易用却又功能强大的 Rust Web 后端框架. 仅仅需要基本的 Rust 基础即可写成功能强大的后端服务器, 我们的目标是: 编码最简单, 功能不缺失, 性能有保障. 主要更新功能: 1. BasicAuthValidator...
Salvo 是一个极其简单易用却又功能强大的 Rust Web 后端框架. 仅仅需要基本的 Rust 基础即可写成功能强大的后端服务器, 我们的目标是: 编码最简单, 功能不缺失, 性能有保障.
主要更新功能:
1. BasicAuthValidator 中的 validate 改成了异步.
2. Rustls 和 Native Tls 的支持, 已经证书的热加载.
3. 改进插件系统.
4. 改进 Server 对应的功能.
???? 功能特色
- 基于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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- NPM包(模块)发布、更新、撤销发布
- 有赞灰度发布与蓝绿发布实践
- 【重磅发布】Linkis 0.10.0 版本发布
- BeetlSQL 3.0.9 发布,Idea 插件发布
- 贝密游戏 0.7.0 发布,发布斗地主
- 【重磅发布】DataSphere Studio 0.9.0 版本发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
全景探秘游戏设计艺术
Jesse Schell / 吕阳、蒋韬、唐文 / 电子工业出版社 / 2010-6 / 69.00元
撬开你脑子里的那些困惑,让你重新认识游戏设计的真谛,人人都可以成为成功的游戏设计者!从更多的角度去审视你的游戏,从不完美的想法中跳脱出来,从枯燥的游戏设计理论中发现理论也可以这样好玩。本书主要内容包括:游戏的体验、构成游戏的元素、元素支撑的主题、游戏的改进、游戏机制、游戏中的角色、游戏设计团队、如何开发好的游戏、如何推销游戏、设计者的责任等。 本书适合任何游戏设计平台的游戏设计从业人员或即将......一起来看看 《全景探秘游戏设计艺术》 这本书的介绍吧!