当前位置: 首页 > 工具软件 > Reqwest > 使用案例 >

Rust 使用 reqwest 发起 GET/POST 异步请求

司寇烨伟
2023-12-01

一、GET请求

1、准备工作,在 Cargo.toml 中加入 reqwest 依赖。reqwest 的 async 使用的是 Tokio 的,所以要同时加入 Tokio 的依赖。

[dependencies]
reqwest = { version = "0.10", features = ["json"] }
tokio = { version = "0.2", features = ["full"] }

2、编写GET代码

use std::collections::HashMap;


async fn get() -> Result<HashMap<String, String>, reqwest::Error>{
    Ok(reqwest::get("https://httpbin.org/ip").await?.json::<HashMap<String, String>>().await?)
}

#[tokio::main]
async fn main() {
    if let Ok(resp) = get().await {
        println!("{:#?}", resp);
    }
}

二、POST请求

1、POST请求,用到了serde_json,所以在 Cargo.toml 中要加入 serde_json。

[dependencies]
reqwest = { version = "0.10", features = ["json"] }
tokio = { version = "0.2", features = ["full"] }
serde_json = "1.0"

2、编写POST代码

use std::collections::HashMap;
use reqwest::header::HeaderMap;
use serde_json::value::Value;

async fn post() -> Result<HashMap<String, Value>, reqwest::Error>{
    // post 请求要创建client
    let client = reqwest::Client::new();

    // 组装header
    let mut headers = HeaderMap::new();
    headers.insert("Content-Type", "application/json".parse().unwrap());

    // 组装要提交的数据
    let mut data = HashMap::new();
    data.insert("user", "tangjz");
    data.insert("password", "dev-tang.com");

    // 发起post请求并返回
    Ok(client.post("https://httpbin.org/post").headers(headers).json(&data).send().await?.json::<HashMap<String, Value>>().await?)
}

#[tokio::main]
async fn main() {
    if let Ok(res) = post().await {
        println!("{:#?}", res);
    }
}

POST 请求比 GET 稍微复杂那么一点点。先看 use 引用,比 GET 请求多了两个 use,分别是 reqwest::header::HeaderMap、serde_json::value::Value,后面简称HeaderMap、Value。

HeaderMap 是用来组装 POST 请求时附加的 headers 数据。 Value 是 serde_json crate 中的,用来接收 POST 请求后返回的 JSON 数据。这点非常重要,在 GET 中接收 JSON 数据用的是 HashMap<String, String> ,在这里把 String 换成了 Value 是为了可以适用于多种类型,而不局限于String。

serde_json::value::Value支持的类列表如下:

pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

三、完整代码

1、最终完整代码

Cargo.toml

[dependencies]
reqwest = { version = "0.10", features = ["json"] }
tokio = { version = "0.2", features = ["full"] }
serde_json = "1.0"

main.rs

use std::collections::HashMap;
use reqwest::header::HeaderMap;
use serde_json::value::Value;


async fn get() -> Result<HashMap<String, String>, reqwest::Error>{
    Ok(reqwest::get("https://httpbin.org/ip").await?.json::<HashMap<String, String>>().await?)
}

async fn post() -> Result<HashMap<String, Value>, reqwest::Error>{
    // post 请求要创建client
    let client = reqwest::Client::new();

    // 组装header
    let mut headers = HeaderMap::new();
    headers.insert("Content-Type", "application/json".parse().unwrap());

    // 组装要提交的数据
    let mut data = HashMap::new();
    data.insert("user", "zhangsan");
    data.insert("password", "https://docs.rs/serde_json/1.0.59/serde_json/");

    // 发起post请求并返回
    Ok(client.post("https://httpbin.org/post").headers(headers).json(&data).send().await?.json::<HashMap<String, Value>>().await?)
}

#[tokio::main]
async fn main() {
    if let Ok(resp) = get().await {
        println!("{:#?}", resp);
    }

    if let Ok(res) = post().await {
        println!("{:#?}", res);
    }
}

其它资料: https://www.itranslater.com/qa/details/2582450332253029376

 类似资料: