Rust 语言从入门到实战
唐刚
Rust 语言中文社区联合创始人
5266 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Rust 语言从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

22|Web开发(下):如何实现一个Todo List应用?

你好,我是 Mike,今天我们继续讲如何使用 Axum 开发 Web 后端。学完这节课的内容后,你应该能使用 Axum 独立开发一个简单的 Web 后端应用了。
第 21 讲,我们已经讲到了第 4 步,处理 Get query 请求,拿到 query 中的参数。下面我们讲如何处理 Post 请求并拿到参数。
这节课的代码适用于 Axum v0.7 版本。

基本步骤

第五步:解析 Post 请求参数

当我们想向服务端提交一些数据的时候,一般使用 HTTP POST 方法。Post 的数据会放在 HTTP 的 body 中,在 HTML 页面上,通常会使用表单 form 收集数据。
和前面的 Query 差不多,Axum 给我们提供了 Form 解包器,可以方便地取得 form 表单数据。你可以参考下面的示例。
#[derive(Deserialize, Debug)]
struct Input {
name: String,
email: String,
}
async fn accept_form(Form(input): Form<Input>) -> Html<&'static str> {
tracing::debug!("form params {:?}", input);
Html("<h3>Form posted</h3>")
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Axum是一个强大而灵活的Web框架,本文详细介绍了如何使用Axum进行Rust语言的Web后端开发。重点讲解了处理Post请求并获取参数的方法,包括解析表单数据和处理Json格式的Post请求参数。此外,还介绍了Axum提供的Rejection机制和自定义Extractor的方法。文章通过简洁清晰的示例代码和详细解释,帮助读者快速了解了Axum框架的Web开发特点和灵活性。内容还涵盖了全局404 Fallback、模板渲染、使用连接池连接PostgreSQL DB等内容,为读者提供了全面的开发指南。总的来说,本文适合想要学习如何使用Axum框架进行Web开发的读者,内容丰富、实用性强。文章还提到了测试后端服务的几种方式,以及对Axum Handler中多个参数顺序的影响,为读者提供了更多思考和探索的空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 语言从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 小虎子🐯
    置顶
    因为刚刚更新了版本,文字内容有调整,所以需要一些时间处理音频,所以今天的音频中午发布哦
    2023-12-13归属地:北京
    1
  • 天穹智能
    老师,请教一下axum开发web的包结构命名组织规范有没有相对比较正式点的,最近公司在用axum开发一个项目,一直在构思模块和包的结构组织。

    作者回复: 你好,这个就按rust的规范命名就可以了。Rust的社区项目命名都比较一致的,这样大家都会比较习惯。目录组织的话,用 2015 风格 和 2018 风格的都有,另外,如果项目比较大,现在推荐使用 workspace:https://doc.rust-lang.org/cargo/reference/workspaces.html

    2023-12-18归属地:上海
    2
    2
  • -
    我发现一个问题,就是同样的State,handler中我放第一个参数没问题,我放到Json参数后报错,希望老师协助分析下

    作者回复: 非常棒的发现! Axum会对handler里面的解包器参数按顺序对Request进行处理。 如果你尝试将State放在Json解包器的后面,编译器会报错。这是因为Json解包器会消耗请求的主体(body),而在请求的主体被消耗之后,State就无法再从请求中提取数据(需要研究Axum内部的实现)。因此,你需要先使用State提取器,然后再使用Json解包器。详情见这里:⚠️ Since parsing JSON requires consuming the request body, the Json extractor must be last if there are multiple extractors in a handler. See “the order of extractors” https://docs.rs/axum/latest/axum/struct.Json.html 所以,Axum虽然说它的handler里面的参数顺序是声明式的(也就是可以随意换位置),但也不是对所有参数都平等对待。对于会消耗body的解包器,还是要注意一下其顺序。

    2023-12-14归属地:北京
    2
    2
  • My dream
    怎么实现生成pdf文件,生成xls文档导入导出?生成word导出?

    作者回复: https://crates.io/crates/xlsxwriter https://crates.io/crates/calamine https://crates.io/crates/docx-rs https://crates.io/crates/cairo-rs https://crates.io/crates/lopdf

    2023-12-14归属地:四川
    1
  • -Hedon🍭
    思考题:声明式参数,我个人觉得有一点“强类型”的味道,这要求把参数是什么明确表示出来,即利于代码的可读性,也有助于类型检查。 另外,想问一下老师,示例代码中数据库连接池通过 State 的方式来传递,这种方式跟声明全局变量相比有什么优劣呢?以及,如果我有多个对象需要共享,那怎么做呢?

    作者回复: rust语言里面不推荐用全局变量,因为很不利于并发编程。实际state就可以扮演一全局变量的作用。多个元素就声明struct,都放一个struct里面管理起来就行。

    2024-01-07归属地:湖北
  • 不忘初心
    bb8 有mysql的crate吗? crates.io上没有找到哦

    作者回复: bb8不支持mysql。你可以用 r2d2 https://github.com/sfackler/r2d2

    2023-12-13归属地:四川
  • 刘丹
    本文是用了 ORM 吗? 因为我们由于使用 ORM 这种东西,因此纯靠手动拼 sql 字符串

    作者回复: 打错啦,由于 换成 没有,我给小编反馈。感谢感谢

    2023-12-13归属地:广东
  • 伯阳
    确实挺方便,天生支持MySQL么

    作者回复: 支持的,有mysql驱动,用法基本一样

    2023-12-13归属地:北京
  • meteor
    请问下,rust有什么好用的表格组件吗,可以编译成wasm的。我们的网页需要一个高性能表格,想用rust开发,然后编译为wasm。目前看了egui,请问还有其他好用的库吗
    2024-03-07归属地:上海
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部