📜  如何在 rust 中发出 http 请求 (1)

📅  最后修改于: 2023-12-03 14:52:34.188000             🧑  作者: Mango

在 Rust 中发出 HTTP 请求

在 Rust 中发出 HTTP 请求是一项常见任务,本文将介绍在 Rust 中发出 HTTP 请求的方法。

使用原生的 Rust

Rust 标准库提供一个 std::net::TcpStream 类型,可用于建立 TCP 连接并发送 HTTP 请求。以下是示例代码:

use std::io::prelude::*;
use std::net::TcpStream;

fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("example.com:80")?;
    stream.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")?;
    let mut buffer = String::new();
    stream.read_to_string(&mut buffer)?;
    println!("{}", buffer);
    Ok(())
}

此代码建立一个 TCP 连接到 example.com 的 HTTP 端口,发送 HTTP GET 请求,读取响应并输出到标准输出。

使用第三方库

许多 Rust crate 提供了更高级别的接口,更容易使用,这里介绍两种较常用的 crate。

reqwest

reqwest crate 提供一个简单易用的接口发出 HTTP 请求。

要使用此库,需要将以下行添加到您的 Cargo.toml 文件中:

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

以下是代码示例:

use reqwest::Error;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let resp = reqwest::get("https://example.com").await?;
    println!("Status: {}", resp.status());
    println!("Headers:\n{:?}", resp.headers());
    println!("Body:\n{}", resp.text().await?);
    Ok(())
}

此代码使用 reqwest::get 函数发送 HTTP GET 请求到 example.com,读取响应并输出一些信息。

此库还提供其他方便的功能,例如自动跟随重定向、JSON 解析等。

hyper

hyper crate 提供了 Rust 中的低级别 HTTP 客户端和服务器端的实现。

要使用此库,将以下行添加到您的 Cargo.toml 文件中:

[dependencies]
hyper = "0.14.10"

以下是代码示例:

use std::io::Result;
use hyper::{Client, Uri};

#[tokio::main]
async fn main() -> Result<()> {
    let client = Client::new();
    let uri = "https://example.com".parse::<Uri>().unwrap();
    let resp = client.get(uri.clone()).await?;
    println!("Status: {}", resp.status());
    println!("Headers:\n{}", resp.headers());
    let body = hyper::body::to_bytes(resp.into_body()).await?;
    println!("Body:\n{}", String::from_utf8_lossy(&body));
    Ok(())
}

此代码使用 hyper::Client 发出 HTTP GET 请求到 example.com,读取响应并输出一些信息。

hyper crate 是底层接口,需要进行更多的配置和实现。但是,如果需要更多的灵活性,它可能是更好的选择。

总结

在 Rust 中发出 HTTP 请求可以使用原生 Rust,也可以使用第三方 crate,如 reqwesthyper。它们都提供了不同程度的灵活性和易用性。