Reqwest HTTP 客户端
学习目标
- 掌握 GET/POST 请求
- 掌握 JSON 交互
- 理解错误处理
核心概念
基本请求
[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 |
|---|---|
| GET | reqwest::get(url).await? |
| POST | client.post(url).json(&data).send().await? |
| 响应 | .text().await?, .json().await? |
| 头部 | .header(key, value) |
| 超时 | Client::builder().timeout() |
练习编辑器
rust
Loading...