Rust中的HTTP客户端:正确发起请求
Rust是一种现代系统编程语言,兼具C++的性能和内存安全性。在开发Web应用、微服务或命令行工具时,经常需要与外部API交互。本文将介绍如何使用流行的crate reqwest 和 ureq 在Rust中创建HTTP客户端。您将学习如何发送GET和POST请求、处理错误以及处理JSON数据。
为什么用Rust处理HTTP请求?
Rust为网络操作提供了独特优势:
- 内存安全 — 编译器保证无内存泄漏和数据竞争。
- 高性能 — 速度媲美C/C++。
- 异步支持 — 内建async/await支持,实现高效I/O操作。
- Crate生态系统 — 数千个现成库,包括HTTP客户端。
在Rust中处理HTTP主要有两种方式:同步(阻塞)和异步(非阻塞)。我们将逐一介绍。
项目设置与crate选择
创建一个新的Rust项目:
cargo new rust-http-clientcd rust-http-client打开 Cargo.toml 并添加依赖:
[dependencies]# 用于异步请求reqwest = { version = "0.12", features = ["json"] }tokio = { version = "1", features = ["full"] }
# 用于同步请求(替代方案)ureq = "2.9"Crate对比:
- reqwest — 最流行的HTTP客户端。支持异步、JSON、Cookie、代理。
- ureq — 轻量级同步客户端。适合简单脚本和CLI工具。
1. 使用reqwest发送GET请求(异步)
先从一个异步GET请求开始。创建文件 src/main.rs:
use reqwest;use std::error::Error;
#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // 发送GET请求 let response = reqwest::get("https://api.github.com/repos/rust-lang/rust") .await? .text() .await?;
println!("GitHub API响应:"); println!("{}", &response[..500]); // 打印前500个字符
Ok(())}说明:
#[tokio::main]— 用于启动Tokio异步运行时的宏。reqwest::get()— 发送GET请求并返回Response。.await?— 等待操作完成并处理错误。.text()— 提取响应体为字符串。
运行项目:
cargo run您将看到来自GitHub API的JSON响应。
2. 使用reqwest发送带JSON的POST请求
现在发送一个带JSON体的POST请求:
use reqwest;use serde::{Deserialize, Serialize};use std::error::Error;
#[derive(Serialize, Deserialize, Debug)]struct Post { title: String, body: String, user_id: u32,}
#[derive(Deserialize, Debug)]struct CreatedPost { id: u32, title: String,}
#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // 创建带设置的客户端 let client = reqwest::Client::new();
// 要发送的数据 let new_post = Post { title: "Rust中的HTTP客户端".to_string(), body: "在Rust中处理HTTP的完整指南".to_string(), user_id: 1, };
// 发送POST请求 let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?;
//