Rust: Web框架Axum和Rest Client协同测试

Axum作为Rust当红Web框架,值得了解一下。下面实例包括几个典型的常场场景。
具体如下:

一、Axum

1、toml中依赖


[dependencies]
tokio = {version="1.39.3",features =["full"]}
axum ={version ="0.7.5",features =["tokio"]}
serde = {version ="1.0.209",features =["derive"]}
serde_json ="1.0.1"

2、main.rs

涉及到简单路由和提取器等,包括主要类型的文件形态的处理。

use axum::{routing::{get,post},Router,response,Form,http::{header::HeaderMap},
};
use serde_json::{Value, json};
use serde::Deserialize;
use axum::extract::{ Query,Json,Path};
use std::collections::HashMap;
use std::sync::Arc;
#[derive(Deserialize,Debug)]
struct User {name: String,old: i32,
}#[derive(Deserialize)]
struct LoginForm {account: String,password: String,
}
#[derive(Deserialize,Debug)]
struct Params {tradedays: Option<i32>,//Option=>字段可以缺省price:Option<f64>,name: Option<String>,
}
#[derive(Deserialize,Debug)]
struct Strategy {name: String,amount: f64,id: i32,
}
#[derive(Debug)]
struct AppState {count: i32
}
#[tokio::main]
async fn main() {let shared_state = Arc::new(AppState { count:0 });let app = Router::new().route("/", get(hello)).route("/headers",get(headers)).route("/html", get(hello_html)).route("/form", get(show_form).post(accept_form)).route("/hashmap", get(query_hashmap))//全部解释成hashmap.route("/user/:name/:old", get(query_user)) .route("/path/:name/:id", get(path)) //两个参数.route("/json", post(query_user_json)).route("/query_json",post({let shared_state = Arc::clone(&shared_state);move |body| query_json(body,shared_state)}   ,)).route("/params",get(get_params)).route("/strategies/", get(query_strategy));println!("Serving on http://localhost:8080 ...");let listener = tokio::net::TcpListener::bind("127.0.0.1:8080").await.unwrap();axum::serve(listener, app).await.unwrap();
}async fn headers(headers: HeaderMap) ->String{format!("{:?}", headers)
}
// Query: ?和=来解析
async fn get_params(Query(params): Query<Params>) -> String {let tradedays = params.tradedays.unwrap_or(0);let price = params.price.unwrap_or(0.0);let name = params.name.unwrap_or("no name".to_string());format!("tradedays {:?}, price: {:?}  name:{:?}", tradedays, price,name)}
//多个复杂的参数
async fn query_strategy(Json(strategy): Json<Strategy>) ->String{println!("strategy :{:?}",strategy);format!("receive=> strategy:{:?}",strategy)
}
//Json(user):Json<User>
async fn query_hashmap(Query(inputs): Query<HashMap<String, String>>) -> String{println!("inputs:{:?}",inputs);format!("inputs:{:?}",inputs)
}
async fn query_user(Path(user):Path<User>){println!("welcome! user:{user:#?}");
}
async fn query_user_json(Json(user): Json<User>) -> response::Json<Value>{println!("response:{:?}",user);Json(json!({ "user": user.name, "old": user.old }))
}
async fn query_json(Json(user):Json<User>,arc: Arc<AppState>)->String{println!("arc:{:?}",arc);format!("user:{:?} ",user)
}// `&'static str` becomes a `200 OK` with `content-type: text/plain; charset=utf-8`
async fn hello() -> &'static str {"Hello, World!"
}
async fn path(Path((name,id)):Path<(String,i32)>) ->String{println!("hi,{name:#?} => id {id:#?}");format!("hi,{},{}",name,id)}
// `Html` will get a `text/html` content-type
async fn hello_html() -> response::Html<&'static str> {response::Html("<h1>Hello HTML</h1><p>Hello, World!</p>")
}async fn show_form() -> response::Html<&'static str> {response::Html(r#"<html><head><title>Login Form</title></head><body><h1>User Info</h1><form method="post"><label for="field1">account:</label><input type="text" name="field1" id="field1"><br><label for="field2">password:</label><input type="text" name="field2" id="field2"><br><input type="submit" value="Submit"></form></body></html>"#)
}async fn accept_form(Form(login): Form<LoginForm>) -> response::Html<String> {let response_html = format!(r#"<html><head><title>Form Submission Result</title></head><body><h1>Form Submission Result</h1><p>account : {}</p><p>password: {}</p></body></html>"#,login.account, login.password);println!("response_html: {}", response_html);response::Html(response_html)
}

二、Rest Client工具协同测试

在vscode中下载Rest Client插件后,通过创建以.http 或 .rest为结尾的文件,进行http请求测试。具体Rest Client功能很强大,这里只介绍,与Axum配合测试的方案。

具体如下:


# 头文件和body之间要有空隔行### 值中不需要引号!
@url = http://localhost:8080 
@name = wowotuo
@token =ad;ipiqedqeqeqeqepqei1213132;dkqdqeqe
@id =6### =>"/";GET;
GET {{url}}/ HTTP/1.1### =>"/html";GET
GET {{url}}/html HTTP/1.1
### /headers
GET {{url}}/headers  HTTP/1.1### /path/:name/:id ; id为输入参数
GET {{url}}/path/{{name}}/{{id}} HTTP/1.1### =>/form;有GET和POST两部分;POST方法要求输入
POST {{url}}/form HTTP/1.1
Content-Type: application/x-www-form-urlencodedaccount={{name}}&password=dbfund### /json; POST.输入user的json格式; 注意JSON格式要"双引号"!
POST {{url}}/json HTTP/1.1
content-type: application/json; charset=utf-8{"name": "{{name}} 你好!","old": 19}### /user/:name/:old; 另外一种表达形式
GET {{url}}/user/{{name}}/32  HTTP/1.1### /params
GET {{url}}/params?tradedays=3&price=3.9&name=breaking### /hashmap; POST,要求输入hashmap
GET {{url}}/hashmap?name={{name}}&old="19"  HTTP/1.1### 对于curl命令的支持 类似 =>GET {{url}}/html
curl --request GET \--url {{url}}/html###--header 'user-agent: vscode-restclient'

三、输出
用Rest Client调试的结果是非常直观。
在这里插入图片描述

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

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

相关文章

OceanBase 关于 place_group_by HINT的使用

PLACE_GROUP_BY Hint 表示在多表关联时&#xff0c;如果满足单表查询后直接进行group by 的情形下&#xff0c;在跟其它表进行关联统计&#xff0c;减少表内部联接。 NO_PLACE_GROUP_BY Hint 表示在多表关联时&#xff0c;在关联后才对结果进行group by。 使用place_group_by …

html+css+js网页设计 故宫10个页面 ui还原度100%

htmlcssjs网页设计 故宫10个页面 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

Spring 学习笔记

概述 Spring 是一个企业级 J2EE 应用开发一站式解决方案&#xff0c;其提供的功能贯穿了项目开发的表现层、业务层和持久化层&#xff0c;同时&#xff0c;Spring 可以和其他应用框架无缝整合 Spring 的特性包括以下几个方面&#xff1a; 轻量&#xff1a;Spring 是一个轻量…

三级_网络技术_58_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)如果在不改变路由表项的前提…

如何录制黑神话悟空的游戏BGM导入iPhone手机制作铃声?

在游戏的世界里&#xff0c;总有那么一些旋律&#xff0c;能够触动玩家的心弦&#xff0c;让人难以忘怀。《黑神话悟空》以其精美的画面和动人的背景音乐&#xff0c;赢得了无数玩家的喜爱。如果你也想将游戏中的背景音录制下来&#xff0c;制作成个性化的m4r格式铃声&#xff…

C++ 设计模式——备忘录模式

C 设计模式——备忘录模式 C 设计模式——备忘录模式1. 主要组成成分2. 逐步构建备忘录模式步骤1: 创建备忘录步骤2: 实现原发器步骤3: 创建管理者&#xff08;负责人&#xff09;类步骤4: 客户端使用 3. 备忘录模式 UML 图UML 图解析 4. 备忘录模式的优点5. 备忘录模式的缺点6…

Camtasia 2024 v2024.0.6 for Mac 中文版 屏幕录像视频录制编辑软件

TechSmith Camtasia for Mac 中文版 是一款专业的屏幕录像及视频录制编辑软件。以业界领先的清晰度重新定义了屏幕录制&#xff0c;将屏幕、摄像头、麦克风和系统音频捕获为独立音轨&#xff0c;实现终极控制和灵活性。通过拖放过渡、标注等功能&#xff0c;以及改进的工作流程…

AI-Talk开发板之helloword

一、说明 创建第一个应用在AI-Talk开发板上运行&#xff0c;编写一个“Hello World”应用&#xff0c;启动之后在主函数里通过UART0&#xff08;debug&#xff09;打印"Hello World"。 官方指导&#xff1a;第一个应用 | 聆思文档中心 (listenai.com) 二、创建工程…

标准库标头 <optional> (C++17)学习之optional

类模板 std::optional 管理一个可选 &#xfeff;的所含值&#xff0c;即既可以存在也可以不存在的值。 一种常见的 optional 使用情况是作为可能失败的函数的返回值。与如 std::pair<T, bool> 等其他手段相比&#xff0c;optional 可以很好地处理构造开销高昂的对象&a…

Ollama拉起本地模型以及rag系统部署。

什么是 Ollama &#xff1f; Ollama 是一个简明易用的本地大模型运行框架。能在本地启动并运行 Llama、qwen、Gemma 及其他大语言模型&#xff0c;没有GPU资源照样可以拉起模型&#xff0c;和LocalAI 比较类似&#xff0c;但是加载模型更容易。 1.安装 安装后运行&#xff0c…

统一NLP和目标检测的DETR(一)——self attention、encoder、decoder

主流目标检测算法劣势 YOLO系列&#xff0c;它基于anchor来做&#xff0c;少不了要用MNS&#xff0c;导致速度相对较慢。 但今天介绍一款DETR&#xff0c;基于VIT的目标检测算法。 那么我们需要先深入过一遍VIT。 Vision transform 1、传统RNN网络的问题 单向&#xff1a;只…

YOLOv8改进实战 | 引入混合局部通道注意力模块MLCA(2023轻量级)

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…

C++和Python混合编程——Python调用C++入门

大纲 背景代码入门环境准备头文件业务代码注册BOOST_PYTHON_MODULE作用 boost::python::class_模板类 编译运行项目地址 背景 Python语言在大数据、人工智能以及大模型开发中扮演着举足轻重的角色&#xff0c;其影响力不断扩大并深化。 在大数据领域&#xff0c;Python以其简…

unittest | 使用unittest模块来测试logging日志模块功能

我们在这篇文章实现了在项目工程中编写一个logging模块&#xff0c;但是我们如何确定我们编写的模块功能的是否正常? 你可能想到将全部代码写完后运行测试&#xff0c;但这是一个非常不好的习惯。❌ 最好的方式&#xff0c;是每写出来一个功能或者方法就对它进行测试&#x…

Java设计模式之装饰器模式详细讲解和案例示范

1. 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向现有对象添加新的功能&#xff0c;而无需修改其结构。这种模式通过使用组合而非继承来扩展对象的行为&#xff0c;在许多实际应用中极为常见。本文将详细介绍装饰器模式…

使用 docker 部署 kvm 图形化管理工具 WebVirtMgr

文章目录 [toc]前提条件镜像构建启动 webvirtmgr创建其他 superuser配置 nginx 反向代理和域名访问绑定 kvm 宿主机local sockettcp 连接 虚拟机创建创建快照虚拟机克隆删除虚拟机 kvm 官方提供了以下这些图形化管理&#xff0c;license 这块也提示了是商业版&#xff08;Comme…

Android实习面经整理第一篇

蔚来Android实习面经 一面(2024/3/11 35min) 自我介绍聊我的本专业说一说MVP架构,MVVM架构 MVP:V层持有P层,用户点击View,把数据发给P层,P层持有M层,然后P层把V层的数据发给M层获取其他数据,最后M层获取完数据后把数据还给P层,更新V层。P层也有V层的引用。MVVM:V层…

Qt 去掉QDialog对话框的问号

QT 对话框的问号是什么&#xff1f; QDialog默认的window flag中包含了Qt::WindowContextHelpButtonHint,这个flag意思是在窗口上提供“上下文帮助”按钮 使用方式/调用方式 void QWidget::setWhatsThis(const QString &)比如&#xff1a; ui->lineEdit_1->setWh…

【pycharm-乱码】简单记录一下都有哪些涉及编码

控制台 路径&#xff1a;setting-》general-》console setting-》editor-》file encodings 路径&#xff1a;setting-》editor->file and code templates #!/user/bin/env python3 # -*- coding: utf-8 -*-setting->tools->ssh terminal

Conda在线/离线迁移虚拟环境

conda简单使用 1.创建环境&#xff1a; conda create -n myenv python3.82.激活环境 conda activate myenv3.退出环境 conda deactivate4.安装包 pip install xxx5.列出所有环境 conda env list conda info --envs6.删除环境 conda remove -n myenv --all离线迁移conda …