Reqwest v0.12.6 发布,支持非 Sync 流式请求体

Rust开发笔记
Rust开发笔记
发布于 2024-08-20 / 22 阅读
0
0

Reqwest v0.12.6 发布,支持非 Sync 流式请求体

reqwest 是 Rust 生态系统中最为流行的异步 HTTP 客户端之一,它以其简洁的 API、强大的功能和出色的性能而备受开发者青睐。近日,reqwest发布了 v0.12.6 版本,该版本引入了一系列新特性、改进和错误修复,进一步提升了用户体验。

danger_accept_invalid_hostnamesrustls 的结合

在网络安全领域,域名验证是至关重要的一环。然而,在某些特殊场景下,例如本地开发环境或内部测试网络中,我们可能需要绕过严格的域名验证。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::ServiceClient 的集成

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 开发者带来更加便捷、高效和安全的网络编程体验。


评论