Rust HTTP客户端:从A到Z正确发起请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么Rust是HTTP请求的绝佳选择

\n

Rust是一种系统编程语言,因其安全性、高性能以及无垃圾回收机制而广受欢迎。如果你正在开发网络应用、网络爬虫或微服务,掌握如何在Rust中正确执行HTTP请求是一项必备技能。在本文中,我们将介绍如何使用reqwest库在Rust中创建一个完整的HTTP客户端,该库是Rust生态系统中处理HTTP的事实标准。

\n

我们将从安装依赖项开始,一直到错误处理和JSON处理。读完本文后,你将能够编写可靠且快速的Rust HTTP客户端,在生产环境中也能稳定运行。

\n\n

项目安装与配置

\n

第一步是创建新项目并添加支持异步和JSON的reqwest依赖项。

\n
cargo new rust_http_client\ncd rust_http_client
\n

打开Cargo.toml并添加:

\n
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"
\n

解释每个依赖项的作用:

\n
    \n
  • reqwest — 核心HTTP客户端。json标志启用序列化/反序列化支持。
  • \n
  • tokio — Rust异步运行时。reqwest中的HTTP请求默认是异步的。
  • \n
  • serde / serde_json — 用于处理JSON(结构体、序列化)。
  • \n
\n

现在一切就绪,可以开始编写代码了。

\n\n

基本GET请求:从服务器获取数据

\n

我们从简单的GET请求开始。创建一个函数,从公共API获取数据并输出到控制台。

\n
use reqwest::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    let url = "https://jsonplaceholder.typicode.com/posts/1";\n    let response = reqwest::get(url).await?;\n\n    println!("状态码: {}", response.status());\n\n    let body = response.text().await?;\n    println!("响应体:\\n{}", body);\n\n    Ok(())\n}
\n

这里发生了什么:

\n
    \n
  • 我们使用#[tokio::main]宏来启动异步函数。
  • \n
  • reqwest::get(url).await?执行GET请求。?符号在请求失败时传播错误。
  • \n
  • response.status()返回HTTP状态码(例如200 OK)。
  • \n
  • response.text().await?将响应体提取为字符串。
  • \n
\n

使用cargo run命令运行代码。你将看到一个包含帖子数据的JSON对象。

\n\n

添加标头和请求参数

\n

在实际应用中,经常需要传递标头(例如API密钥)或查询参数。操作方法如下:

\n
use reqwest::Client;\nuse std::collections::HashMap;\n\n#[tokio::main]\nasync fn main() -> Result<(), reqwest::Error> {\n    let client = Client::new();\n\n    let mut params = HashMap::new();\n    params.insert("userId", "1");\n\n    let response = client\n        .get("https://jsonplaceholder.typicode.com/posts")\n        .header("Accept", "application/json")\n        .query(&params)\n        .send()\n        .await?;\n\n    let posts: serde_json::Value = response.json().await?;\n    println!("帖子数量: {}", posts.as_array().unwrap().len());\n\n    Ok(())\n}
\n

关键点:

\n
    \n
  • 我们创建了Client——这是一个带有连接池的可复用HTTP客户端。在生产代码中,始终使用Client而不是直接调用reqwest::get。
  • \n
  • .header()方法添加标头。
  • \n
  • .query()接受参数字典并自动编码URL。
  • \n
  • .json()直接反序列化

博客

书籍推荐