Rust 中的 HTTP 请求利器:reqwest

发布于:2025-06-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

在现代编程中,与外部服务进行通信是常见的需求,而 HTTP 请求是实现这一目标的主要方式之一。在 Rust 生态系统中,reqwest 是一个非常流行的 HTTP 客户端库,它提供了简洁而强大的 API,支持同步和异步操作。本文将详细介绍如何使用 reqwest 发送各种类型的 HTTP 请求,包括 GET、POST、PUT 和 DELETE,并提供完整的示例代码。

1. 简介

reqwest 是一个现代的 HTTP 客户端库,支持同步和异步操作。它提供了以下特性:

  • 同步和异步支持:通过启用不同的特性(如 blockingjson),可以使用同步或异步的方式发送 HTTP 请求。
  • JSON 支持:方便地发送和接收 JSON 数据。
  • 错误处理:提供了详细的错误信息,方便调试。
  • 丰富的功能:支持自定义请求头、查询参数、表单数据等。

在本文中,我们将使用 reqwest 的同步 API,通过启用 blocking 特性来实现。如果你需要异步操作,可以启用 json 特性并使用异步运行时(如 tokio)。

2. 添加依赖

Cargo.toml 文件中添加 reqwest 依赖,并启用所需的特性:

[dependencies]
reqwest = { version = "0.11", features = ["blocking", "json"] }

3. GET 请求

GET 请求是最常见的 HTTP 请求类型,用于从服务器获取数据。

示例代码

以下是一个使用 reqwest 发送 GET 请求的示例:

use reqwest::blocking::Client;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let response = client.get("https://httpbin.org/get")
        .send()?;

    if response.status().is_success() {
        let body = response.text()?;
        println!("Response: {}", body);
    } else {
        println!("Request failed with status: {}", response.status());
    }

    Ok(())
}

输出

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "reqwest/0.11"
  },
  "origin": "123.456.789.0",
  "url": "https://httpbin.org/get"
}

4. POST 请求

POST 请求通常用于向服务器提交数据,例如创建新资源。

示例代码

以下是一个使用 reqwest 发送 POST 请求的示例:

use reqwest::blocking::Client;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let payload = json!({
        "name": "Alice",
        "age": 30
    });

    let response = client.post("https://httpbin.org/post")
        .json(&payload)
        .send()?;

    if response.status().is_success() {
        let body = response.text()?;
        println!("Response: {}", body);
    } else {
        println!("Request failed with status: {}", response.status());
    }

    Ok(())
}

输出

{
  "args": {},
  "data": "{\"name\":\"Alice\",\"age\":30}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "21",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "reqwest/0.11"
  },
  "json": {
    "age": 30,
    "name": "Alice"
  },
  "origin": "123.456.789.0",
  "url": "https://httpbin.org/post"
}

5. PUT 请求

PUT 请求通常用于更新服务器上的资源。

示例代码

以下是一个使用 reqwest 发送 PUT 请求的示例:

use reqwest::blocking::Client;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let payload = json!({
        "name": "Alice",
        "age": 30
    });

    let response = client.put("https://httpbin.org/put")
        .json(&payload)
        .send()?;

    if response.status().is_success() {
        let body = response.text()?;
        println!("Response: {}", body);
    } else {
        println!("Request failed with status: {}", response.status());
    }

    Ok(())
}

输出

{
  "args": {},
  "data": "{\"name\":\"Alice\",\"age\":30}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "21",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "reqwest/0.11"
  },
  "json": {
    "age": 30,
    "name": "Alice"
  },
  "origin": "123.456.789.0",
  "url": "https://httpbin.org/put"
}

6. DELETE 请求

DELETE 请求通常用于删除服务器上的资源。

示例代码

以下是一个使用 reqwest 发送 DELETE 请求的示例:

use reqwest::blocking::Client;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let response = client.delete("https://httpbin.org/delete")
        .send()?;

    if response.status().is_success() {
        let body = response.text()?;
        println!("Response: {}", body);
    } else {
        println!("Request failed with status: {}", response.status());
    }

    Ok(())
}

输出

{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "reqwest/0.11"
  },
  "json": null,
  "origin": "123.456.789.0",
  "url": "https://httpbin.org/delete"
}

7. 错误处理

reqwest 提供了详细的错误处理机制,可以帮助开发者更好地调试和处理请求失败的情况。

示例代码

以下是一个带有错误处理的示例:

use reqwest::blocking::Client;

fn main() {
    let client = Client::new();
    let response = client.get("https://httpbin.org/status/404")
        .send();

    match response {
        Ok(response) => {
            if response.status().is_success() {
                let body = response.text().unwrap();
                println!("Response: {}", body);
            } else {
                println!("Request failed with status: {}", response.status());
            }
        }
        Err(e) => {
            println!("Request failed with error: {}", e);
        }
    }
}

输出

Request failed with status: 404 Not Found

8. 总结

reqwest 是一个功能强大且易于使用的 HTTP 客户端库,支持同步和异步操作。通过本文的介绍和示例代码,你可以在自己的 Rust 项目中快速上手并使用它来发送各种类型的 HTTP 请求。无论是 GET、POST、PUT 还是 DELETE 请求,reqwest 都能轻松应对,同时提供详细的错误处理机制,帮助开发者更好地调试和优化代码。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


网站公告

今日签到

点亮在社区的每一天
去签到