如何选择合适的 Rust HTTP 客户端

编者注:这篇 Rust 文章最后更新于 2022 年 12 月 21 日,以更新代码并包括不太知名但有用的 HTTP 客户端,例如 Actix Web 客户端、rustify 和 tokio-curl。查看这篇文章,了解有关使用 reqwest 库发出 HTTP 请求的教程。

HTTP 客户端的重要性怎么强调都不为过,如何在桌面和移动设备上更改 Discord 主题这就是为什么您在为手头的任务选择正确的 HTTP 客户端时应该做好功课。根据您的项目构建的技术堆栈或您必须进行的 HTTP 调用的数量,如何在 Facebook 上隐藏某人的故事某些库会很适合您,而其他库可能比它们的价值更麻烦。

在本指南中,如何在桌面和移动设备上锁定 Discord 频道我们将介绍六个 Rust HTTP 客户端的主要功能:

我们还将演示如何对每个库发出 GET 和 POST 请求。如何将您的 PlayStation Network 帐户连接到 Discord让我们开始吧!

1.卷锈

curl-rust为 Rust提供libcurl绑定,如何从 Amazon Prime Video 中删除注册设备这意味着它包含一个用于基于 C 的 HTTP 库的接口。换句话说,您可以将 libcurl 的功能与 Rust 提供的附加安全层一起使用。

如果您想完全留在 Rust 领域并避免基于如何在 Discord 上管理双因素身份验证 C 的 curl 可能产生的问题,您可能想要选择完全依赖 Rust 的库之一。重要的是,curl-rust 不提供对异步请求的任何支持,这意味着它比任何异步请求都更慢且占用更多资源。

我的建议是仅在您确实需要使用 如何将音频文件插入 Microsoft Wordcurl 时才使用 curl-rust——例如,如果您正在从事一个依赖于多种技术栈并且已经集成了 curl 的项目。curl-rust 附带了一些您并不总是需要的功能,如何在桌面和移动设备上注销 Discord例如对 Telnet、SMTP、FTP、IMAP 或 LDAP 等传输协议的支持。有更多的轻量级解决方案可以为当今的 Web 需求提供更多量身定制的功能。

下面是一个使用 curl-rust 的 POST 请求示例。注意更复杂的语法:

use std::io::Read;

use curl::easy::Easy;

fn main() {

let mut data = "this is the body".as_bytes();

let mut easy = Easy::new();

easy.url("http://www.example.com/upload").unwrap();

easy.post(true).unwrap();

easy.post_field_size(data.len() as u64).unwrap();

let mut transfer = easy.transfer();

transfer.read_function(|buf| {

Ok(data.read(buf).unwrap_or(0))

}).unwrap();

transfer.perform().unwrap();

}

curl-rust 的受欢迎程度统计如下:

  • GitHub 星数:880

  • crates.io上的总下载量:9,818,464

  • 最近下载(过去 90 天):1,191,182

2.超级

当高级库没有提供您正在寻找的所有功能时如何在台式机和移动设备上更改 Amazon Prime Video 中的字幕颜色,查看超级库可能是个好主意。它的级别相对较低,因此非常适合需要更高级功能的情况。

我们将在本文中讨论的几个库都基于 hyper。它在设计上是异步的,同时提供客户端和服务器端 API。它是一个可靠的、久经考验的库,享有广泛的生产用途。

如果您不需要 hyper 提供的任何高级功能,如何在移动设备和 PC 上创建、查看和共享来自 YouTube 视频的剪辑可能值得查看基于 hyper 的更高级别的库。hyper 旨在成为其他库和应用程序的构建块。如果你想要一个更方便的 HTTP 客户端,hyper 推荐检查reqwest,因为它建立在 hyper 之上(稍后会详细介绍)。

此外,hyper 拥有一个非常活跃的贡献者社区,如何在 iPhone、Android 和 Web 上的 Gmail 中阻止或取消阻止电子邮件甚至还运行着一个Discord 服务器。官方网站提供了几个指南来帮助您快速开始运行 HTTP 客户端或服务器。更多详细信息可以在 API 参考中找到——例如,对象是如何实现的。Body

下面介绍如何使用 reqwest 发出 GET 请求。如何在 Google 文档中使用跟踪更改首先,创建一个新的客户端对象,然后将一个 URL 传递给它以从中检索数据。如何在 Google 相册中使用地图视图接下来,使用 Rust 支持的新await语法来等待响应:

use hyper::Client;

let client = Client::new();

// Parse an `http::Uri`...

let uri = "http://httpbin.org/ip".parse()?;

// Await the response...

let resp = client.get(uri).await?;

println!("Response: {}", resp.status());

以下是 hyper 优势的概述:

  • HTTP/1 和HTTP/2支持

  • 异步设计

  • 通过并发支持领先性能

  • 经过良好测试的 HTTP 客户端

  • 广泛的生产用途

  • 客户端和服务器端 API 支持

如果你在家里记分:

  • GitHub 星数:10,905

  • crates.io上的总下载量:67,138,349

  • 最近下载(过去 90 天):8,981,728

3.请求西部

如果您正在寻找更高级别的 HTTP 客户端,如何在 Telegram 上添加自定义通知声音reqwest可能会满足您的需求。该库提供了一个基于超级库构建的 HTTP 客户端。

默认情况下,reqwest 包含一个能够发出异步请求的客户端。但是,如果您只需要进行少量 HTTP 调用并且不希望使用异步函数增加复杂性,也可以将其配置为使用“阻塞”客户端。这是一个极好的功能。

HTTP 代理、如何导入和导出 Microsoft Word 的功能区设置可自定义的重定向策略和对 cookie 的支持等功能使 reqwest 在便利性方面成为首选。此 cookie 存储对于身份验证非常有用。

官方文档中的这个示例展示了如何发出 GET 和 POST 请求。如您所见,语法非常简单:

// 1. GET

let body = reqwest::get("https://www.rust-lang.org")

.await?

.text()

.await?;

println!("body = {:?}", body);

// 2. POST

let client = reqwest::Client::new();

let res = client.post("http://httpbin.org/post")

.body("the exact body that is sent")

.send()

.await?;

总而言之,reqwest 提供以下突出显示的功能:

  • 异步和阻塞客户端

  • 支持纯正文、JSON、urlencoded和多部分数据

  • 可定制的重定向策略

  • HTTP 代理

  • 使用系统原生 TLS

  • 饼干

至于它的受欢迎程度:

  • GitHub 星数:6,693

  • crates.io上的总下载量:42,958,476

  • 最近下载(过去 90 天):6,447,770

4.以撒

与 reqwest 非常相似,在 Microsoft Word 中跟踪更改时如何编辑字体和注释Isahc提供了一个具有异步和同步方法的高级 HTTP 客户端。然而,与 reqwest 不同的是,Isahc 在底层使用了 curl。如果您想要一个需要与 curl 保持兼容性的客户端,这将很有用。它还提供了使用稳定且积极开发的流行库的所有常见好处。

下面是一个简单的同步 GET 请求的示例。特别是status,headers、 和text函数使得从响应对象中检索常用信息变得非常容易:

use isahc::prelude::*;

fn main() -> Result<(), isahc::Error> {

// Send a GET request and wait for the response headers.

// Must be `mut` so we can read the response body.

let mut response = isahc::get("http://example.org")?;

// Print some basic info about the response to standard output.

println!("Status: {}", response.status());

println!("Headers: {:#?}", response.headers());

// Read the response body as text into a string and print it.

print!("{}", response.text()?);

Ok(())

}

让我们来看看 Isahc 最显着的特点:

  • 完全支持 HTTP/1.1 和 HTTP/2

  • 可配置的请求超时

  • 具有请求和响应主体的异步和增量读取和写入的完全异步核心

  • 支持异步/等待的同步和异步 API

  • 会话和 cookie 持久性

下面的数据显示了 Isahc 的相对受欢迎程度:

  • GitHub 星数:595

  • crates.io上的总下载量:2,514,510

  • 最近下载(过去 90 天):438,357

5. 冲浪

Surf是一个完全模块化的客户端,采用异步设计。它可以通过强大的中间件系统进行扩展。默认的 native-client 使用 curl,但您也可以使用curl-client。

curl-client 通过 Isahc 使用 curl 作为 HTTP 服务器。如果你不想使用基于 curl 构建的客户端,你可以选择使用 hyper-client,它使用 hyper 作为 HTTP 服务器。

这是一个简单的中间件示例,它打印有关每个请求的详细信息。如您所见,它使用经典的req、client和next参数,您可以在许多其他 HTTP 客户端中找到这些参数。该next参数允许您将请求传递给另一个中间件模块或请求处理程序:

use futures::future::BoxFuture;

use surf::middleware::{Next, Middleware, Request, Response, HttpClient};

use std::time;

/// Log each request's duration

#[derive(Debug)]

pub struct Logger;

impl<C: HttpClient> Middleware<C> for Logger {

fn handle<'a>(

&'a self,

req: Request,

client: C,

next: Next<'a, C>,

) -> BoxFuture<'a, Result<Response, surf::Exception>> {

Box::pin(async move {

println!("sending request to {}", req.uri());

let now = time::Instant::now();

let res = next.run(req, client).await?;

println!("request completed ({:?})", now.elapsed());

Ok(res)

})

}

}

以下是使用 Surf 的简单 GET 请求示例:

#[tokio::main]

async fn main() -> Result<(), surf::Error> {

let mut res = surf::get("https://httpbin.org/get").await?;

println!("{}", res.body_string().await?);

Ok(())

}

要运行该程序,您需要这些依赖项:

surf = "2.3"

tokio = { version = "1", features = ["full"] }

冲浪的显着特点包括:

  • 可通过强大的中间件系统进行扩展

  • 通过客户端接口重用连接

  • 完全流式传输请求和响应

  • 默认启用 TLS/SSL

  • 默认启用 HTTP/2

至于它的受欢迎程度:

  • GitHub 星数:1,332

  • crates.io上的总下载量:1,406,370

  • 最近下载(过去 90 天):222,065

6. 乌雷格

ureq是一个最小请求库,如果您对最小依赖树感兴趣,它会很有用。它是为方便起见而设计的,并提供了一个阻塞 API 来使事情变得简单。它不使用任何不安全的 Rust,这对于想要坚持使用Safe Rust 的开发人员来说非常有用。

如果您重视编译时间,ureq 是一个特别好的选择。它不使用 curl 服务器,也不提供异步功能。这些是故意遗漏的,目的是使库尽可能地最小化和轻量级。出于这个原因,在撰写本文时,还没有迁移到异步功能的计划。

下面是一个使用 ureq 的小 GET 请求示例。注意设置标头和发出请求的简单性:

fn main() -> Result<(), ureq::Error> {

let body: String = ureq::get("http://example.com")

.set("Example-Header", "header value")

.call()?

.into_string()?;

Ok(())

}

重申一下,ureq 的主要功能包括:

  • 最小依赖树

  • 简单的 API 设计

  • 仅阻止 API

  • 不使用不安全的 Rust

最后,让我们一目了然地了解一下ureq的受欢迎程度:

  • GitHub 星数:1,153

  • crates.io上的总下载量:5,579,564

  • 最近下载(过去 90 天):1,071,415

荣誉奖

如果您正在寻找用于在 Rust 中构建 HTTP 客户端的流行库之外的选项,那么您很幸运!以下是您在探索选项时可能需要考虑的其他不太知名的库:

Actix 网络客户端

Actix Web Client是一个流行的库,用于在 Rust 中构建 HTTP 客户端。Actix Web Client以其速度和效率着称,是在 Rust 中构建 Web 应用程序的强大而务实的选择。下面是正在运行的库的示例:

// create client

let mut client = awc::Client::default();

// construct request

let req = client.get("http://www.rust-lang.org")

.insert_header(("User-Agent", "awc/3.0"));

// send request and await response

let res = req.send().await?;

println!("Response: {:?}", res);

生锈

rustify是一个轻量级且灵活的库,用于在 Rust 中构建 HTTP 客户端。它有助于简化脚手架 HTTP API 的过程,并提供一系列用于构建和使用 HTTP 端点的功能。

Rustify 支持异步和同步客户端,并允许使用提供的 Client 特性自定义客户端实现。Rustify 还支持序列化请求、反序列化响应以及处理原始请求和响应数据。它包括用于处理请求的各种帮助程序,例如中间件支持和响应包装。

下面是一个用 Rustify 创建的简单客户端:

use rustify::{Client, Endpoint};

use rustify_derive::Endpoint;

// Defines an API endpoint at /test/path that takes no inputs and returns an

// empty response.

#[derive(Endpoint)]

#[endpoint(path = "test/path")]

struct Test {}

let endpoint = Test {};

let client = Client::default("http://api.com"); // Configures base address of http://api.com

let result = endpoint.exec(&client).await; // Sends GET request to http://api.com/test/path

assert!(result.is_ok());

东京卷曲

如果您有兴趣在 Rust 中构建异步 HTTP 客户端,tokio-curl可能值得考虑。该库为 libcurl HTTP 库提供了一个基于未来的接口,该库是一个广泛使用且备受推崇的用于发送 HTTP 请求的 C 库。

通过在 Rust 的 libcurl 之上构建,tokio-curl 允许您利用该库的强大功能和稳定性,同时利用 Rust 的 tokio 库提供的异步编程模型。

无论您需要发送简单的 HTTP 请求还是带有自定义标头和身份验证的更复杂的请求,tokio-curl 都提供了一系列功能和选项来帮助您完成工作。如果您正在寻找一种在 Rust 中构建异步 HTTP 客户端的可靠且高效的方法,tokio-curl 绝对值得探索。请参阅下面的库:

extern crate curl;

extern crate futures;

extern crate tokio_core;

extern crate tokio_curl;

use std::io::{self, Write};

use curl::easy::Easy;

use futures::Future;

use tokio_core::reactor::Core;

use tokio_curl::Session;

fn main() {

// Create an event loop that we'll run on, as well as an HTTP `Session`

// which we'll be routing all requests through.

let mut lp = Core::new().unwrap();

let session = Session::new(lp.handle());

// Prepare the HTTP request to be sent.

let mut req = Easy::new();

req.get(true).unwrap();

req.url("https://www.rust-lang.org").unwrap();

req.write_function(|data| {

io::stdout().write_all(data).unwrap();

Ok(data.len())

}).unwrap();

// Once we've got our session, issue an HTTP request to download the

// rust-lang home page

let request = session.perform(req);

// Execute the request, and print the response code as well as the error

// that happened (if any).

let mut req = lp.run(request).unwrap();

println!("{:?}", req.response_code());

}

选择最好的 Rust HTTP 客户端

如果你想要 Rust 中的低级 HTTP 库,我建议使用 hyper。它已投入生产并完全用 Rust 编写,因此您不必太担心安全问题。此外,它是唯一提到生产准备的库。

对于更高级的 HTTP 库,我会选择 reqwest。该库建立在 hyper 之上,因此它提供了许多与 hyper 相同的优势,并且具有更方便的启动语法。

在本指南中,我们谈到了可以在一系列其他情况下使用的其他库。如果你必须使用 curl,你应该探索 curl-rust、Isahc,甚至是 Surf。如果您正在寻找不会增加太多编译时间的轻量级库,那么 ureq 是您的不二之选。但是,请注意 ureq 仅支持同步请求。

希望这种比较可以帮助您为下一个 Rust 项目选择最佳的 HTTP 客户端。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/130041354