想要用 Rust 语言进行 HTTP 请求,只用标准库可不太容易。Reqwest,这个提供了方便易用的 HTTP 客户端的 Rust 库,值得一看。
Rust语言
简介
Reqwest,是 seanmonstar 在 Github 上开源的 Rust 语言的 HTTP 客户端库,代码仓库在 https://github.com/seanmonstar/reqwest,目前版本为 0.10.6。Reqwest 简单易用,功能强大,包括异步和阻塞模式,可以处理各种类型的请求数据,支持 HTTP 代理、TLS 加密、Cookie 存储等功能,另外还包括了对 WASM 的支持。
HTTP请求
安装
使用 Cargo 安装,在项目的 Cargo.toml 中添加依赖:
[dependencies]reqwest = { version = "0.10", features = ["json"] }
Reqwest 有包括 tls、blocking、gzip、json、socks 等的特性,可进行 features 的自定义配置。
在异步模式下,还需要 Tokio 运行时:
tokio = { version = "0.2", features = ["full"] }
示例
Reqwest 可以方便的发起GET请求,直接使用 get 函数即可:
extern crate reqwest;#[tokio::main]async fn main() -> Result { let res = reqwest::get("https://www.rust-lang.org").await?; println!("Status: {}", res.status()); let body = res.text().await?; println!("Body:{}", body); Ok(())}
另外,也可以使用阻塞模式进行,此时需要使用 blocking 模块:
extern crate reqwest;fn main() -> Result> { env_logger::init(); println!("GET https://www.rust-lang.org"); let mut res = reqwest::blocking::get("https://www.rust-lang.org/")?; println!("Status: {}", res.status()); println!("Headers:{:?}", res.headers()); res.copy_to(&mut std::io::stdout())?; println!("Done."); Ok(())}
想要进行更加复杂的请求,可以进行 Reqwest 的 Client 的实例化,并使用该客户端进行请求:
let client = reqwest::Client::new();let res = client.post("http://httpbin.org/post") .body("the exact body that is sent") .send() .await?;
进行 JSON 相关的请求也是十分简单的,把发送文本的 body 改为 json 即可:
let mut map = HashMap::new();map.insert("lang", "rust");map.insert("body", "json");let client = reqwest::Client::new();let res = client.post("http://httpbin.org/post") .json(&map) .send() .await?;
Reqwest 默认使用环境变量中的代理设定,支持包括 SOCKS 协议在内的 HTTP 代理,也可以使用 builder 来使用代理:
let proxy = reqwest::Proxy::all("socks5://127.0.0.1:9050").expect("tor proxy should be there");let client = reqwest::Client::builder() .proxy(proxy) .build() .expect("should be able to build reqwest client");
另外,Reqwest 还支持在 WASM 中使用,可以在 Rust 中实现 HTTP 请求,并通过 WASM 在前端 JS 中调用。
use wasm_bindgen::prelude::*;#[wasm_bindgen]pub async fn run() -> Result { let res = reqwest::Client::new() .post("https://postman-echo.com/post") .body("This is expected to be sent back as part of response body.") .header("Content-Type", "application/x-www-form-urlencoded") // .header("Access-Control-Allow-Origin", "*") .send() .await?; let text = res.text().await?; Ok(JsValue::from_str(&text))}
Rust Reqwest
总结
Reqwest 接口设计简洁,使用方便,易于使用;且功能丰富,可以应对大多数场景的应用,是 Rust 语言在 HTTP 请求时的优秀选择。
Reqwest 代码结构清晰,注释明了,示例丰富,遵循模块化思想,是进行 Rust 库学习的优秀例子。