79·常用生态进阶

Reqwest HTTP 客户端

Reqwest HTTP 客户端

学习目标

  1. 掌握 GET/POST 请求
  2. 掌握 JSON 交互
  3. 理解错误处理

核心概念

基本请求

[dependencies]
reqwest = { version = "0.12", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct User {
    id: u32,
    name: String,
    email: String,
}

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    // GET 请求
    let body = reqwest::get("https://httpbin.org/get")
        .await?
        .text()
        .await?;
    println!("GET: {}", body);

    // JSON 响应
    let user: User = reqwest::get("https://api.example.com/user/1")
        .await?
        .json()
        .await?;
    println!("User: {:?}", user);

    Ok(())
}

POST 请求

use serde::{Serialize, Deserialize};

#[derive(Serialize)]
struct CreateUser {
    name: String,
    email: String,
}

#[derive(Deserialize, Debug)]
struct Response {
    id: u32,
    success: bool,
}

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::new();

    let user = CreateUser {
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
    };

    let resp: Response = client.post("https://api.example.com/users")
        .json(&user)
        .send()
        .await?
        .json()
        .await?;

    println!("响应: {:?}", resp);
    Ok(())
}

请求头

use reqwest::header;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::new();

    let resp = client.get("https://api.example.com/data")
        .header(header::AUTHORIZATION, "Bearer token123")
        .header(header::CONTENT_TYPE, "application/json")
        .send()
        .await?;

    println!("状态: {}", resp.status());
    println!("头: {:?}", resp.headers());

    Ok(())
}

超时和重试

use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::builder()
        .timeout(Duration::from_secs(10))
        .connect_timeout(Duration::from_secs(5))
        .build()?;

    let resp = client.get("https://slow-api.example.com")
        .send()
        .await?;

    Ok(())
}

小结

操作API
GETreqwest::get(url).await?
POSTclient.post(url).json(&data).send().await?
响应.text().await?, .json().await?
头部.header(key, value)
超时Client::builder().timeout()

练习编辑器

rust
Loading...