A crate implementing a wrapper around reqwest to allow for client middleware chains.
This crate provides functionality for building and running middleware but no middleware implementations. This repository also contains a couple of useful concrete middleware crates:
reqwest-retry
: retry failed requests.reqwest-tracing
:tracing
integration, optional opentelemetry support.
The reqwest-middleware
client exposes the same interface as a plain reqwest
client, but
ClientBuilder
exposes functionality to attach middleware:
# Cargo.toml
# ...
[dependencies]
reqwest = "0.11"
reqwest-middleware = "0.1.6"
reqwest-retry = "0.1.5"
reqwest-tracing = "0.2.3"
tokio = { version = "1.12.0", features = ["macros", "rt-multi-thread"] }
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff};
use reqwest_tracing::TracingMiddleware;
#[tokio::main]
async fn main() {
// Retry up to 3 times with increasing intervals between attempts.
let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
let client = ClientBuilder::new(reqwest::Client::new())
// Trace HTTP requests. See the tracing crate to make use of these traces.
.with(TracingMiddleware::default())
// Retry failed requests.
.with(RetryTransientMiddleware::new_with_policy(retry_policy))
.build();
run(client).await;
}
async fn run(client: ClientWithMiddleware) {
client
.get("https://truelayer.com")
.header("foo", "bar")
.send()
.await
.unwrap();
}
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
The following third-party middleware use request-middleware
:
reqwest-conditional-middleware
- Per-request basis middlewarehttp-cache
- HTTP caching rulesreqwest-cache
- HTTP cachingaliri_reqwest
- Background token management and renewalhttp-signature-normalization-reqwest
(not free software) - HTTP Signatures