tower-http-client

Crates.iotower-http-client
lib.rstower-http-client
version0.4.0-alpha.1
sourcesrc
created_at2024-04-21 14:50:34.156592
updated_at2024-06-08 15:57:42.249941
descriptionExtra Tower middlewares and utilities for HTTP clients.
homepage
repositoryhttps://github.com/alekseysidorov/tower-reqwest
max_upload_size
id1215444
size62,467
Aleksey Sidorov (alekseysidorov)

documentation

https://docs.rs/crate/tower-http-client

README

tower-http-client

tests crates.io Documentation MIT/Apache-2 licensed

This library provides middlewares and various utilities for HTTP-clients.

Thus, it extends the tower_http functionality for creating HTTP clients using tower middlewares.

At the moment, the de facto standard client library is reqwest, which is poorly compatible with the tower services, but thanks to the tower_reqwest crate, it can be used with the any tower_http layers.

The first goal of the project is to create a more flexible and extensible alternative for reqwest_middleware.

Examples

Simple client usage with layers from the 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(())
}
Commit count: 80

cargo fmt