因为不会用markdown排版,所以希望能有更好的阅读体验,关注我的同名微信官方账号。谢谢你。
acurl

在本文中,我们将使用rust实现一个类似于linux工具curl的小型cli工具。姑且称之为acurl吧。
一.功能分析
接受命令行参数,解析成rust能理解的参数-> CLAP。
创建一个带参数的http请求并获得响应- >reqwest
优雅的命令行输入->彩色
创建项目并添加依赖项
这里我们使用cargo来创建我们的项目,项目名为acurl。
货物新acurl
cd acurl
然后使用cargo add添加依赖项。
>货加总之拍彩色jsonxf mime reqwest tokio
然后打开Cargo.toml文件。
[包装]
name = "acurl "
版本= "0.1.0 "
edition = "2021 "
[依赖关系]
总之= "1.0.63" #错误处理
Clap = "3.2.20" #命令行解析
Colored = "2.0.0" #终端彩色显示
Jsonxf = "1.1.1" #json格式
Mime = "0.3.16" #处理Mime类型
Reqwest = "0.11.11" #http请求
Tokio = "1.21.0" #异步处理库
如您所见,cargo增加了依赖性。这里需要打开clap、reqwest和tokio的一些特性,在Cargo.toml文件中进行编辑。
clap = {version = "3.2.20 ",features = ["derive"]}
reqwest = {version = "0.11.11 ",features = ["json"]}
tokio = {version = "1.21.0 ",features = ["full"]}
二、Cli处理
在我们开始编写代码之前,我们使用cargo来生成关于依赖库的帮助文档,以帮助我们最初如何使用相关的依赖库。该命令如下所示:
货运单据-打开#此处-用浏览器打开
这里可以先看一下clap的帮助文档,这里我截取一下演示。
使用clap::Parser;
///问候一个人的简单程序
#[派生]
#[鼓掌]
结构参数{
///要问候的人的名字
#[鼓掌]
名称:字符串,
///问候的次数
#[鼓掌]
计数:u8,
}
fn main {
let Args = Args::parse;
0中的for _ in..args.count {
println!
}
}
可以看出,demo使用了clap的宏,使得命令行的参数变得简单。我们只需要描述数据结构,最后用clap提供的解析函数进行解析。虽然parse不是我们定义的,但是它是由# [derivative]自动生成的。参考这个演示,我们可以自己编写cli相关的代码。
使用clap::{Parser,AppSettings };
//下面///注释是文档,clap会作为cli的帮助使用。
///像curl这样的cli工具
#[派生]
#[鼓掌]

#[鼓掌]
结构选项{
#[鼓掌]
subcmd:子命令,
}
//子命令对应不同的请求方法,这里我们只定义get和post。
#[派生]
枚举子命令{
得到,
帖子,
}
//获取子命令
///使用get方法检索响应
#[派生]
结构获取{
///获取请求命令的url
url:字符串,
}
//post子命令
///用post方法检索响应
#[派生]
结构发布{
///post请求命令的url
url:字符串,
post请求命令的正文
正文:Vec,
}
fn main {
let Opts = Opts::parse;
println!;
}
然后我们编译并运行,
>货物建造。/target/debug/acurl
acurl 1.0
比弗达达
像curl这样的cli工具
用法:
acurl.exe
选项:
-h,help打印帮助信息
-V,- version打印版本信息
子命令:
使用get方法检索响应
帮助打印此消息或给定子命令的帮助
post使用post方法检索响应
可见,clap根据我们的评论生成的帮助信息也是非常优雅的。我们来看看post命令的帮助信息:
> ./target/debug/acurl post -h
acurl-post
使用post方法检索响应
用法:
acurl.exe邮报[正文]...
ARGS:
发布请求的Url
...帖子请求的正文
选项:

-h,- help打印帮助信息
让我们再次测试acurl是否能够正确解析post命令。
>./target/debug/acurl post www.baidu.com a = 1 b = 2
Opts { subcmd: Post }
正如您所看到的,命令行被成功解析,并且实现了期望的功能。请注意下一节的参数验证和网络请求。感谢阅读!


