专栏首页Rust语言学习交流【大家的项目】Salvo - 一个简单的 Web 后端框架

【大家的项目】Salvo - 一个简单的 Web 后端框架

为什么要写这个框架

因为我笨,无法学会使用 actix-web 等现存的框架。当我想把以前的 go 的 web 服务使用 rust 实现时,一眼看去,似乎每个框架都比 go 里存在框架复杂, 本来 Rust 的学习曲线就够陡峭的了, 又何苦把 Web 框架整得那么复杂?

如何做到足够简单

很多底层的实现 Hyper 都已经实现,所以,一般需求,基于 Hyper 实现应该没有错。Salvo 也是一样。核心功能是提供还用简单的API,以及一个功能强大并且灵活的路由系统。

Salvo 里统一了 Handler 和 Middleware. Middleware 就是 Handler. 通过路由的 before 或者 after 添加到 Router 上。本质上, Middleware 和 Handler 都是处理 Request 请求,并且可能向 Response 写入数据。而 Handler 接收的参数是 Request, Depot, Response 三个, 其中 Depot 用于存储请求处理过程中的临时数据. 为方便书写, 在用不着的情况下可以省略掉某些参数.

use Salvo::prelude::*;

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

另外路由系统提供的 API 也是极其简单的, 但是, 功能却是强大的. 正常使用需求下, 基本上就是只关注 Router 一个类型即可.

路由系统

我自己感觉路由系统是跟其他的框架不太一样的. Router 可以写平,也可以写成树状。这里区业务逻辑树与访问目录树。业务逻辑树是根据业务逻辑需求,划分 router 结构,形成 router 树,它不一定与访问目录树一致。

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

Router::new().path("articles").get(list_articles).post(create_article);
Router::new()
    .path("articles/<id>")
    .get(show_article)
    .patch(edit_article)
    .delete(delete_article);

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

Router::new()
    .path("articles")
    .get(list_articles)
    .push(Router::new().path("<id>").get(show_article));

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

Router::new()
    .path("articles")
    .before(auth_check)
    .post(list_articles)
    .push(Router::new().path("<id>").patch(edit_article).delete(delete_article));

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

Router::new()
    .push(
        Router::new()
            .path("articles")
            .get(list_articles)
            .push(Router::new().path("<id>").get(show_article)),
    )
    .push(
        Router::new()
            .path("articles")
            .before(auth_check)
            .post(list_articles)
            .push(Router::new().path("<id>").patch(edit_article).delete(delete_article)),
    );

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

更多信息可以查看网站 https://salvo.rs

源码地址: https://github.com/salvo-rs/salvo

非常欢迎大家为项目贡献力量,可以通过以下方法为项目作出贡献:

  • 在 issue 中提交功能需求和 bug report;
  • 在 issues 或者 require feedback 下留下自己的意见;
  • 通过 pull requests 提交代码;
  • 在博客或者技术平台发表 Salvo 相关的技术文章。

本文分享自微信公众号 - Rust语言学习交流(rust-china),作者:chrislearn

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【大家的项目】发现一个有趣的项目salvo web framework

    MikeLoveRust
  • python_web(三)一个简单web后端框架

    星辉
  • 写一个简单的WEB框架

    前面都是从httpserver中添加功能,下面希望把添加web功能写成框架的形式,如果进行开发,只需要响应的功能模块就行,而不是在httpserver中改写。

    DC童生
  • 用 Python 写一个简单的Web框架

    在Python中,WSGI(Web Server Gateway Interface)定义了Web服务器与Web应用(或Web框架)之间的标准接口。在WSGI的...

    诸葛青云
  • 【大家的项目】一个简单的Tcp转发工具

    MikeLoveRust
  • 第一个前后端分离的web项目

      现在,开发系统是一个很火的潮流,尤其是随着数据的越来越大,前后端分离就变得势在必行,这两天刚好要开题,就跑了一个前后端分离的代码。首先我们介绍后端的流程

    一计之长
  • 【大家的项目】Rust Web开发框架 Poem 0.3发布!

    在和社区的朋友聊axum的过程中,发现大家都不太玩得明白,我突然就想做一个用起来简单点的。

    MikeLoveRust
  • 用python的Django框架来做一个简单的web应用(一)

    什么是web开发:“通俗的说,web开发就是我们说的做网站。它分为网页部分和逻辑部分也就是我们说的前台与后台,前台负责与用户的交互,显示数据。用到HTML显示数...

    小末快跑
  • 用python的Django框架来做一个简单的web应用(二)

    创建管理员用户:执行语句python manage.py createsuperuser, 输入用户名和密码可以创建一个超级管理员用户。注意输入密码的时候不会显...

    小末快跑
  • 用python的Django框架来做一个简单的web应用(三)

    在urls.py 中添加app_name='app_name'#app的名称。通过app_name加以区分。在html模板中可以调用<li><a href="{...

    小末快跑
  • springsecurity框架的学习,根据操作修改后台项目进行学习,项目搭建和springsecurity简单入门(一)

    1 将一个简单的后台的项目在idea里面导入,这个项目里面是没有安全相关的东西的,我们现在需要做的就是在这个项目里面,集成springsecurity框架,让这...

    一天不写程序难受
  • 【大家的项目】RiteRaft - Raft 应用快速开发框架,160 行启动一个 Raft 服务

    ritedb/riteraft 是一个实用 Raft 框架,用于快速开发和验证基于 Raft 共识算法的分布应用式。

    MikeLoveRust
  • 一个简单且易上手的 Spring boot 后台管理框架 EL-ADMIN

    一个基于 Spring Boot 2.1.0 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue 的前后端分离的后...

    java思维导图
  • Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb

    书童小二
  • 12.8 VR扫描:三星MR头显国行版售价4499元;创企CyUtil LLC推VR环境系统

    VRPinea
  • 5 个优秀前端 UI 框架 | 码云周刊第 65 期

    码云Gitee
  • 【项目】Github上的一个简单项目:用人工智能预测大学录取概率

    每年有超过200万的大学申请被提交,每个申请都有一定的机遇与风险。即使是最高学术水平的学生的申请也存在随机因素,因此往往会面临困难的局面——大学招生中固有的精英...

    AiTechYun
  • Node全栈为前端带来更多可能

    用户1263954
  • 使用Jquery+EasyUI框架开发项目+下载+帮助--EasyUI的简介

    在学完所有的web开发的视频之后,一直还没有做相应的项目,想必大家都有体会在项目中不断的磨练,才能得到最好的锻炼。最近,接手了一个SL的项目,项目组长要求在了解...

    程序猿小亮

扫码关注云+社区

领取腾讯云代金券