首页 > 其他分享 >作者自述背景 - Salvo - 一个简单的 Web 后端框架

作者自述背景 - Salvo - 一个简单的 Web 后端框架

时间:2023-10-08 21:59:09浏览次数:25  
标签:Web Salvo articles 自述 article Router new path 路由

看过作者的自述后, 再重新看一下这个框架, 感觉又有一些新的体会...

 

为什么要写这个框架

因为我笨,无法学会使用 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 相关的技术文章。

标签:Web,Salvo,articles,自述,article,Router,new,path,路由
From: https://www.cnblogs.com/pythonClub/p/17750236.html

相关文章

  • 开发日志:企业微信实现扫码登录(WEB)
    一:获取扫码登陆所需的参数:appid,secret,agentid登录企业微信:https://work.weixin.qq.com/扫码登录文档:https://work.weixin.qq.com/api/doc/90000/90135/909881:获取appid点击我的企业就可以看到企业ID信息,这就是appid 2:获取secret和agentid(1):点击应用管理-》点击创建应用......
  • Zabbix监控web网页登录
    1.web监控需求以zabbix-UI页面的登录监控,模拟登录,输入账号密码,实现首页的健康监控。1.模拟登录输入zabbix账号密码,登录后台,如果登录失败就报警2.基于响应状态码判断非200即报警2.配置步骤2.1抓取HTTP数据包既然是模拟登录,先抓包,查看zabbix登录的数据提交,通过浏览器开......
  • 【webapp】 JSP 的常见语法元素
    1.注释: JSP支持三种类型的注释:HTML注释、JSP注释和Java注释。HTML注释:使用 <!--注释内容--> 来添加HTML注释。JSP注释:使用 <%--注释内容--%> 来添加JSP注释。Java注释:使用 // 或 /**/ 来添加Java注释。2.声明: 使用 <%!声明代码%> 来定义......
  • web DevOps / shell d3 / case
    s案例1:中断及退出案例2:基于case分支编写脚本案例3:编写一键部署软件脚本案例4:启动脚本案例5:使用Shell函数案例6:字符串处理案例7:字符串初值的处理1案例1:中断及退出1.1问题本案例要求编写两个Shell脚本,相关要求如下:从键盘循环取整数(0结束)并求和,输出最终结果1.2方......
  • 【webapp】JSP工作原理和过程
    JSP编译:当客户端请求访问一个JSP页面时,Web服务器首先检查是否已经编译过该JSP页面。如果没有编译过或者源文件已更改,服务器会将JSP文件编译成一个Servlet源文件。Servlet编译:编译后的Servlet源文件进一步被编译成Java字节码文件,这个过程由服务器的JSP引擎完......
  • .net6 webapi 项目注册为windows 服务后访问静态文件
    直接使用kestrel运行程序时,只需要http://localhost:port/file.html即可访问,但是将程序注册为windows服务后,http://localhost:port/file.html会报404的错误,此时要访问到这个文件,http://localhost:port/wwwroot/file.html才行,如果想要windows服务和web的url一致只需要加......
  • [网鼎杯 2020 朱雀组]phpweb
    原理反序列化命令执行call_user_func解题过程首先进入靶场莫名其妙报了个错,翻译一下是date()函数的问题--不管了,先看页面原代码看到这里有自动post请求,数据时func=date&p=Y-m-dh:i:sa,看格式像是传入一个函数和参数,那就试试使用func=system&p=ls却发现过滤了,尝试了很多......
  • Sovit2D在线组态设计 构建LNG加气站Web Scada控制系统
    前言天然气是最清洁的化石能源,天然气使用安全、应用广泛,在炊事、供热、发电、交通等领域扮演重要角色。LNG(液化天然气)作为一种市场化的全球能源,能够很好的解决天然气的可及性问题。建设背景在LNG行业迅速发展的同时,加气站的监管难度加大,加之许多地方管理工作相对薄弱滞后、控......
  • JavaWeb开发
    1.学习路线前端:HTML,CSS,JS--Ajax,Axios--Vue,Element--前端工程化后端:Maven,SpringBoot开发,Mysql,JDBCWEB案例,会话跟踪技术,AOP,SpringBoot原理需求分析,表结构设计。接口文档,功能实现,测试2.Web:万维网(WorldWideWeb)......
  • springboot整合websocket
    引入依赖<!--webSocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类/***websocket配置类*/@ConfigurationpublicclassWebS......