reqwest 是 Rust 生态系统中最为流行的异步 HTTP 客户端之一,它以其简洁的 API、强大的功能和出色的性能而备受开发者青睐。近日,reqwest
发布了 v0.12.6 版本,该版本引入了一系列新特性、改进和错误修复,进一步提升了用户体验。
danger_accept_invalid_hostnames
与 rustls
的结合
在网络安全领域,域名验证是至关重要的一环。然而,在某些特殊场景下,例如本地开发环境或内部测试网络中,我们可能需要绕过严格的域名验证。reqwest
v0.12.6 版本新增了 danger_accept_invalid_hostnames
选项,允许用户在使用 rustls
作为 TLS 后端时禁用域名验证。
以下示例展示了如何使用 danger_accept_invalid_hostnames
选项:
use reqwest::ClientBuilder;
let client = ClientBuilder::new()
.danger_accept_invalid_hostnames(true)
.build()
.unwrap();
// 现在可以使用该客户端发送请求到具有无效域名的服务器
注意: 启用 danger_accept_invalid_hostnames
会降低应用程序的安全性,请谨慎使用。
tower::Service
与 Client
的集成
tower
是 Rust 中一个流行的网络服务抽象库,它提供了一套通用的接口和中间件,方便开发者构建可组合和可扩展的网络应用程序。reqwest
v0.12.6 版本实现了 tower::Service
trait,使得 Client
可以作为 tower
中间件栈的一部分。
以下示例展示了如何将 reqwest
客户端集成到 tower
中间件栈中:
use reqwest::Client;
use tower::ServiceBuilder;
use tower::ServiceExt;
use http::{Request, Response, Body};
use hyper::Body as HyperBody;
#[tokio::main]
async fn main() {
// 创建一个 reqwest 客户端
let client = Client::new();
// 使用 tower::ServiceBuilder 创建一个中间件栈
let mut service = ServiceBuilder::new()
// 添加 reqwest 客户端作为 Service
.service(client)
// 添加其他中间件...
.into_inner();
// 创建一个 HTTP 请求
let request = Request::builder()
.uri("https://www.example.com")
.body(Body::empty())
.unwrap();
// 使用中间件栈发送请求并获取响应
let response: Response<HyperBody> = service
.ready()
.await
.unwrap()
.call(request)
.await
.unwrap();
// 处理响应...
}
非 Sync
流式请求体
在之前的版本中,reqwest
要求所有流式请求体都必须实现 Sync
trait,这在某些情况下可能会限制开发者的灵活性。reqwest
v0.12.6 版本取消了这一限制,现在可以使用非 Sync
的流作为请求体。
以下示例展示了如何使用非 Sync
流作为请求体:
use reqwest::Client;
use futures::stream::{self, StreamExt};
use std::time::Duration;
use tokio::time::sleep;
#[tokio::main]
async fn main() {
let client = Client::new();
let stream = stream::iter(vec!["chunk1", "chunk2", "chunk3"])
.map(|s| async move {
sleep(Duration::from_secs(1)).await;
Ok::<_, reqwest::Error>(s.to_string())
})
.buffered(1); // 使用 buffered 限制并发请求
let res = client
.post("https://httpbin.org/post")
.body(reqwest::Body::wrap_stream(stream))
.send()
.await
.unwrap();
println!("Response: {:?}", res);
}
利用 hickory-dns
实现 Happy Eyeballs
Happy Eyeballs 是一种 DNS 解析策略,它可以同时尝试 IPv4 和 IPv6 地址,并优先使用响应更快的地址,从而提高网络连接速度和可靠性。reqwest
v0.12.6 版本在使用 hickory-dns
作为 DNS 解析器时默认启用 Happy Eyeballs。
代理环境修复
reqwest
v0.12.6 版本修复了代理环境下的一些问题,确保 HTTP(S)_PROXY
环境变量的优先级高于 ALL_PROXY
环境变量,并修复了 blocking::RequestBuilder::header()
方法在传递敏感头信息时可能导致的问题。
总结
reqwest
v0.12.6 版本带来了许多令人兴奋的新特性、改进和错误修复,进一步巩固了其作为 Rust 生态系统中领先的异步 HTTP 客户端的地位。相信这些更新将为广大 Rust 开发者带来更加便捷、高效和安全的网络编程体验。