#tower-middleware #http #http-service #http-request #service #async #io

tower-http-client

为 HTTP 客户端提供额外的 Tower 中间件和实用工具

5 个不稳定版本

0.4.0-alpha.12024 年 6 月 8 日
0.3.2 2024 年 5 月 5 日
0.3.0 2024 年 4 月 30 日
0.2.1 2024 年 4 月 21 日

#152 in HTTP 客户端

MIT/Apache

27KB
361 代码行

tower-http-client

tests crates.io Documentation MIT/Apache-2 licensed

此库为 HTTP 客户端提供中间件和多种实用工具。

因此,它扩展了使用 tower_http 中间件创建 HTTP 客户端的 tower 功能。

目前,事实上的标准客户端库是 reqwest,它与 tower 服务兼容性较差,但多亏了 tower_reqwest crate,它可以与任何 tower_http 层一起使用。

项目的首要目标是创建一个比 reqwest_middleware 更灵活、更可扩展的替代品。

示例

使用来自 tower_http 的层进行简单客户端使用的示例。

use http::{header::USER_AGENT, HeaderValue};
use tower::{ServiceBuilder, ServiceExt};
use tower_http::ServiceBuilderExt;
use tower_http_client::{ServiceExt as _, ResponseExt as _};
use tower_reqwest::HttpClientLayer;

/// Implementation agnostic HTTP client.
type HttpClient = tower::util::BoxCloneService<
    http::Request<reqwest::Body>,
    http::Response<reqwest::Body>,
    anyhow::Error,
>;

/// Creates HTTP client with Tower layers on top of the given client.
fn make_client(client: reqwest::Client) -> HttpClient {
    ServiceBuilder::new()
        // Add some layers.
        .override_request_header(USER_AGENT, HeaderValue::from_static("tower-http-client"))
        // Make client compatible with the `tower-http` layers.
        .layer(HttpClientLayer)
        .service(client)
        .map_err(anyhow::Error::from)
        .boxed_clone()
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Create a new client
    let client = make_client(reqwest::Client::new());
    // Execute request by using this service.
    let response = client
        .clone()
        .get("http://ip.jsontest.com")
        .send()?
        .await?;

    let text = response.body_reader().utf8().await?;
    println!("{text}");

    Ok(())
}

依赖项

~3–14MB
~171K SLoC