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> {
let body = reqwest::get ("https://httpbin.org/get" )
.await ?
.text ()
.await ?;
println! ("GET: {}" , body);
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()