javaer学rust(三)

手机软件开发 2024-9-22 05:50:27 87 0 来自 中国
在上一篇,我们写了一个只有main方法的demo,实现了下载网络文件的功能,但基于代码复用的头脑,我们可以把下载的功能写成共用的方法,如下:
async fn downloadFile(file_url:&str)->String{    let body = reqwest::get(file_url)        .await        .unwrap()        .text()        .await        .unwrap();    println!("body = {:?}", body);    return body;}#[tokio::main]async fn main() {    let file_url="http://localhost:8234/group2/default/20220915/17/13/4/test.txt";    downloadFile(file_url);}假如运行这个代码,会输出一些告警信息
warning: unused implementer of `Future` that must be used  --> src\main.rs:16:5   |16 |     download_file(file_url);   |     ^^^^^^^^^^^^^^^^^^^^^^^^   |   = note: `#[warn(unused_must_use)]` on by default   = note: futures do nothing unless you `.await` or poll themwarning: `go-fastdfs-rust-client` (bin "go-fastdfs-rust-client") generated 1 warning    Finished dev [unoptimized + debuginfo] target(s) in 0.11s     Running `target\debug\go-fastdfs-rust-client.exe`Process finished with exit code 0固然有告警信息,代码着实是正常运行的,但奇怪的是download_file内里的信息并没有打印出来,假如加断点的话可以发今世码根本没实验到,为什么呢?标题着实出在异步方法上,由于方法是异步的,main方法没有被壅闭,download方法还没真正实验程序就竣事了。那怎么办理呢,着实告警信息内里已经告诉办理方案了,那就是在异步方法背面加上await方法
async fn download_file(file_url:&str)->String{    let body = reqwest::get(file_url)        .await        .unwrap()        .text()        .await        .unwrap();    return body;}#[tokio::main]async fn main() {    let file_url="http://localhost:8234/group2/default/20220915/17/13/4/test.txt";    let body=download_file(file_url);    println!("body = {:?}", body.await);}再次运行,就会发现没有告警信息了,而且文件内容也被打印出来了
由于背面我们还要做上传文件、删除文件等功能,因此我们可以思量把干系功能都放到一个文件,对rust来说就是一个mod,雷同于java的package,如图:

我们把上传文件的功能也加上
use std::borrow::Cow;const UPLOAD_URL:&str ="http://localhost:8234/group2/upload";pub async fn upload_file(file_path:&str)->String{    let file_byte=std::fs::read(file_path).unwrap();    // 肯定要有file_name方法,且参数不能为空,否则数据上传失败    let part=reqwest::multipart:art::bytes(Cow::from(file_byte)).file_name("test.txt");    let form = reqwest::multipart::Form::new().part("file",part);    let response = reqwest::Client::new()        .post(UPLOAD_URL)        .multipart(form)        .send()        .await        .unwrap();    let url=response.text().await.unwrap();    println!("{}",url);    return url;}pub async fn download_file(file_url:&str)->String{    let body = reqwest::get(file_url)        .await        .unwrap()        .text()        .await        .unwrap();    return body;}由于使用了multipart方式上传,在实验代码前必要把reqwest的multipart特性启用(rust的依赖和java的依赖有些不一样,java假如引用一个jar包的话,内里的所有功能都能用了,但rust必要你明确指出引用哪些功能),启用方式是修改cargo.toml文件,在features的属性上把multipart加上,如下:
[dependencies]reqwest = { version = "0.11.11", features = ["json","multipart"] } #futures = "0.3" # for our Async / await blockstokio = { version = "1.12.0", features = ["full"] }这时间假如在main方法中再调用download_file方法的话,就必要明确声明要使用哪个mod哪个方法了,雷同于java的import,否则会提示找不到相应的方法
mod file_service;use file_service::download_file;#[tokio::main]async fn main() {    let file_url="http://localhost:8234/group2/default/20220915/17/13/4/test.txt";    let body=download_file(file_url).await;    println!("body = {:?}", body);}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 15:27, Processed in 0.150272 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表