构建一个rust生产应用读书笔记四(实战2)

此门课程学习采用actix-web框架完成一个生产级别的rust应用,在 actix-web 中,Extractors 是一个非常重要的概念,它们用于从传入的 HTTP 请求中提取特定的信息片段。actix-web 提供了多种内置的提取器,以满足常见的使用场景。说白了,就是传入的参数怎么通过服务端的框架能提取出来

常用的提取器及其用途(如果精通spring 或熟悉web开发本章节可以忽略):

常用的 Extractors

1. Path Extractor

    • 用途:从请求的路径中提取动态路径段
    • 示例:/users/{id}, 把id作为入参
use actix_web::{web, App, HttpResponse, HttpServer, Responder};async fn get_user(info: web::Path<(String,)>) -> impl Responder {let user_id = info.into_inner().0;HttpResponse::Ok().body(format!("User ID: {}", user_id))
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().route("/users/{id}", web::get().to(get_user))).bind("127.0.0.1:8080")?.run().await
}浏览器中输入 http://127.0.0.1:8080/users/14 返回结果如下

2. Query Extractor

  • 用途:从请求的查询参数中提取信息。
  • 示例
use actix_web::{web, App, HttpServer, Responder};
use serde::Deserialize;#[derive(Deserialize)]
struct Info {username: String,password: String,
}async fn login(info: web::Query<Info>) -> impl Responder {format!("Welcome, {} your password is {}!",info.username, info.password)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().route("/login", web::get().to(login))).bind("127.0.0.1:8080")?.run().await
}

浏览器输入:http://127.0.0.1:8080/login?username=zhangsan&password=123

3. Json Extractor

  • 用途:从请求体中解析 JSON 编码的数据。
  • 实例
use actix_web::{web, App, HttpServer, Responder};
use serde::Deserialize;#[derive(Deserialize)]
struct User {name: String,email: String,
}async fn create_user(user: web::Json<User>) -> impl Responder {format!("User created: {}, email:{}", user.name, user.email)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().route("/users", web::post().to(create_user))).bind("127.0.0.1:8080")?.run().await
}

用户api调试工具显示如下

4. Form Extractor

  • 用途:从请求体中解析表单数据
  • 示例
use actix_web::{web, App, HttpServer, Responder};
use serde::Deserialize;#[derive(Deserialize)]
struct FormData {name: String,email: String,
}async fn submit_form(form: web::Form<FormData>) -> impl Responder {format!("Form submitted: Name: {}, Email: {}", form.name, form.email)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().route("/submit", web::post().to(submit_form))).bind("127.0.0.1:8080")?.run().await
}

用户api调试工具显示如下

编写订阅功能的代码

在Cargo.toml 文件中加入序列化依赖配置

[dependencies]
actix-web = "4"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
serde = { version = "1", features = ["derive"] }

结合我们之前所学的知识,看看改如何定义订阅处理方法

#[derive(serde::Deserialize)]
pub struct FormData {email: String,name: String,
}
async fn subscribe(_form: web::Form<FormData>) -> HttpResponse {HttpResponse::Ok().finish()
}

整体流程(原书里面写的有点啰嗦)

  1. 请求到达:当一个HTTP POST请求到达/subscribe路径时,actix-web会调用subscribe函数来处理这个请求。
  2. 数据提取web::Form<FormData>提取器会从请求体中读取数据,并尝试将其反序列化为FormData结构体。这里假设请求体是URL编码的格式(例如,email=user@example.com&name=JohnDoe)。
  3. 反序列化serde_urlencoded库会被用于将URL编码的数据反序列化为FormData结构体。
  4. 错误处理:如果反序列化失败(例如,请求体格式不正确),actix-web会自动返回一个400 Bad Request响应。
  5. 处理逻辑:如果反序列化成功,subscribe函数会被调用。在这个示例中,subscribe函数只是简单地返回一个200 OK响应,没有实际处理FormData中的数据。

这本书从实战的角度出发,本人结合作者的观点将学习心得记录下来,供大家学习。 本人也是在学习Rust的过程中发现问题、排查问题、解决问题,如有错误的理解,欢迎指正提出宝贵意见,这样才能进步。

注:各位亲爱的小伙伴们,今年是我从事软件行业的第20年,通过博客记录的方式将我知道的、理解的、有帮助的都分享给大家。同时,也提供就业指导,专业简历优化服务。你们的支持是我最大的动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优选生产报工系统:关键选择要素

【优选生产报工系统&#xff1a;数据分析、产品管理与基础数据登录的关键选择要素】 在快速变化的制造业环境中&#xff0c;生产报工系统的重要性不言而喻。它不仅仅是一种记录工时和监控生产进度的工具&#xff0c;更是一种能够实现数据驱动决策、优化产品管理和确保基础数据…

使用Python打造高效的PDF文件管理应用(合并以及分割)

在日常工作和学习中&#xff0c;我们经常需要处理大量PDF文件。手动合并、分割PDF不仅耗时&#xff0c;还容易出错。今天&#xff0c;我们将使用Python的wxPython和PyMuPDF库&#xff0c;开发一个强大且易用的PDF文件管理工具。 C:\pythoncode\new\mergeAndsplitPdf.py 所有代…

MyBatis写法汇总

Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…

【C语言程序设计——入门】C语言程序开发环境(头歌实践教学平台习题)【合集】

目录&#x1f60b; <第1关&#xff1a;程序改错> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第2关&#xff1a;scanf 函数> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第1关&a…

You need to call SQLitePCL.raw.SetProvider()

在.NET环境中使用Entity Framework Core&#xff08;EF Core&#xff09;连接SQLite数据库时&#xff0c;报错。 使用框架 .NET8 错误信息&#xff1a; Exception: You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling…

皮肤伤口分割数据集labelme格式248张5类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;284 标注数量(json文件个数)&#xff1a;284 标注类别数&#xff1a;5 标注类别名称:["bruises","burns","cu…

LeetCode 2255统计是给定字符串前缀的字符串数目

问题描述: 在字符串处理的编程任务中&#xff0c;经常会遇到判断一个字符串数组中的元素是否为另一个字符串前缀的情况。例如&#xff0c;给定一个字符串数组 words 和一个字符串 s&#xff0c;且 words[i] 和 s 都只包含小写英文字母&#xff0c;我们需要找出 words 中有多少…

JVM系列之内存区域

每日禅语 有一位年轻和尚&#xff0c;一心求道&#xff0c;多年苦修参禅&#xff0c;但一直没有开悟。有一天&#xff0c;他打听到深山中有一古寺&#xff0c;住持和尚修炼圆通&#xff0c;是得道高僧。于是&#xff0c;年轻和尚打点行装&#xff0c;跋山涉水&#xff0c;千辛万…

大腾智能CAD:国产云原生三维设计新选择

在快速发展的工业设计领域&#xff0c;CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能&#xff0c;不仅显著提升了设计效率与精度&#xff0c;还促进了设计思维的创新与拓展&#xff0c;为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…

css常用属性有哪些

在上篇文章我们知道了利用css选择器来对HTML进行简单装饰&#xff0c;就像做word文档一样&#xff0c;需要对哪一段落修改格式&#xff0c;就需要先选中&#xff0c;css选择器就是这意思。这格式如何修改&#xff0c;怎么放大字体&#xff0c;怎么加粗&#xff0c;怎么修改背景…

leetcode 3195.包含所有1的最小矩形面积I

1.题目要求: 2.解题步骤: class Solution { public:int minimumArea(vector<vector<int>>& grid) {//设置二维数组deque<deque<int>> row_distance;for(int i 0;i < grid.size();i){//遍历数组&#xff0c;把每行头部1的小标和尾部1的下标代…

搭建Tomcat(三)---重写service方法

目录 引入 一、在Java中创建一个新的空项目&#xff08;初步搭建&#xff09; 问题&#xff1a; 要求在tomcat软件包下的MyTomcat类中编写main文件&#xff0c;实现在MyTomcat中扫描myweb软件包中的所有Java文件&#xff0c;并返回“WebServlet(url"myFirst")”中…

创建线程 ---- 实例

1、C语言 创建线程 执行2个不同的函数&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h>// 第一个线程要执行的函数 void* function1(void* arg) {printf("Function 1 is running\n");// 执行…

使用mybatisplus的逆向工程自动生成数据库中表对应的实体类、mapper、service、serviceImpl、controller等文件

使用mybatisplus的逆向工程自动生成数据库中表对应的实体类、mapper、service、serviceImpl、controller等文件 详细流程如下&#xff1a; 1、引入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-sta…

Linux介绍与安装CentOS 7操作系统

什么是操作系统 操作系统&#xff0c;英⽂名称 Operating System&#xff0c;简称 OS&#xff0c;是计算机系统中必不 可少的基础系统软件&#xff0c;它是 应⽤程序运⾏以及⽤户操作必备的基础环境 ⽀撑&#xff0c;是计算机系统的核⼼。 操作系统的作⽤是管理和控制计算机系…

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语&#xff0c;却回答了所有问题 目录 &#x1f4da;前言 &#x1f4da;一、信号的本质 &#x1f4d6;1.异步通信 &#x1f4d6;2.信…

【西门子PLC.博途】——面向对象编程及输入输出映射FC块

当我们做面向对象编程的时候&#xff0c;需要用到输入输出的映射。这样建立的变量就能够被复用&#xff0c;从而最大化利用了我们建立的udt对象。 下面就来讲讲映射是什么。 从本质上来说&#xff0c;映射就是拿实际物理对象对应程序虚拟对象&#xff0c;假设程序对象是I0.0&…

WebRTC服务质量(04)- 重传机制(01) RTX NACK概述

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

MySQL索引的理解

MySQL与磁盘的交互 根据冯诺依曼结构体系&#xff0c;我们知道我们任何上层的应用想要去访问磁盘就必须要通过内存来访问&#xff0c;MySQL作为一款储存数据的服务&#xff0c;肯定是很多时间要用来访问磁盘。而大量访问磁盘一定会影响运行效率的在innoDB的存储引擎下为了减少…

spring集成ehcache

目录 一、前言二、使用ehcache注解方式2.1、配置2.2、使用示例三、直接读取xml方式3.1、配置3.2、使用示例3.3、结果说明一、前言 问题背景:一些业务场景中,一些数据往往是长期不变更,但数据使用较多。为了满足系统性能需要,可以借助本地缓存去使用,保证同一个JVM实例只保…