pub struct HttpClient { /* private fields */ }Expand description
HTTP client with tower middleware stack
This client provides a clean interface over a tower service stack that includes:
- Timeout handling
- Automatic retries with exponential backoff
- User-Agent header injection
- Concurrency limiting (optional)
Use HttpClientBuilder to construct instances with custom configuration.
§Thread Safety
HttpClient is Clone + Send + Sync. Cloning is cheap (internal channel clone).
The client uses tower::buffer::Buffer internally, which allows true concurrent
access without any mutex serialization. Callers do NOT need to wrap HttpClient
in Mutex or Arc<Mutex<_>>.
§Example
// Just store the client directly - no Mutex needed!
struct MyService {
http: HttpClient,
}
impl MyService {
async fn fetch(&self) -> Result<Data, HttpError> {
// reqwest-like API: response has body-reading methods
self.http.get("https://example.com/api").await?.json().await
}
}Implementations§
Source§impl HttpClient
impl HttpClient
Sourcepub fn new() -> Result<Self, HttpError>
pub fn new() -> Result<Self, HttpError>
Create a new HTTP client with default configuration
§Errors
Returns an error if TLS initialization fails
Sourcepub fn builder() -> HttpClientBuilder
pub fn builder() -> HttpClientBuilder
Create a builder for configuring the HTTP client
Sourcepub fn get(&self, url: &str) -> RequestBuilder
pub fn get(&self, url: &str) -> RequestBuilder
Create a GET request builder
Returns a RequestBuilder that can be configured with headers
before sending with .send().await.
§URL Requirements
The URL must be an absolute URI with scheme and authority (host).
Relative URLs like /path or example.com/path are rejected with
HttpError::InvalidUri.
Valid examples:
https://api.example.com/usershttp://localhost:8080/health(requiresTransportSecurity::AllowInsecureHttp)
§URL Construction
Query parameters must be encoded into the URL externally (e.g. via url::Url):
use url::Url;
let mut url = Url::parse("https://api.example.com/search")?;
url.query_pairs_mut().append_pair("q", "rust").append_pair("page", "1");
let resp = client
.get(url.as_str())
.header("authorization", "Bearer token")
.send()
.await?;§Example
// Simple GET
let resp = client.get("https://api.example.com/data").send().await?;Sourcepub fn post(&self, url: &str) -> RequestBuilder
pub fn post(&self, url: &str) -> RequestBuilder
Create a POST request builder
Returns a RequestBuilder that can be configured with headers,
body (JSON, form, bytes), etc. before sending with .send().await.
§Example
// POST with JSON body
let resp = client
.post("https://api.example.com/users")
.json(&NewUser { name: "Alice" })?
.send()
.await?;
// POST with form body
let resp = client
.post("https://auth.example.com/token")
.form(&[("grant_type", "client_credentials")])?
.send()
.await?;Sourcepub fn put(&self, url: &str) -> RequestBuilder
pub fn put(&self, url: &str) -> RequestBuilder
Create a PUT request builder
Returns a RequestBuilder that can be configured with headers,
body (JSON, form, bytes), etc. before sending with .send().await.
§Example
let resp = client
.put("https://api.example.com/resource/1")
.json(&UpdateData { value: 42 })?
.send()
.await?;Sourcepub fn patch(&self, url: &str) -> RequestBuilder
pub fn patch(&self, url: &str) -> RequestBuilder
Create a PATCH request builder
Returns a RequestBuilder that can be configured with headers,
body (JSON, form, bytes), etc. before sending with .send().await.
§Example
let resp = client
.patch("https://api.example.com/resource/1")
.json(&PatchData { field: "new_value" })?
.send()
.await?;Sourcepub fn delete(&self, url: &str) -> RequestBuilder
pub fn delete(&self, url: &str) -> RequestBuilder
Create a DELETE request builder
Returns a RequestBuilder that can be configured with headers
before sending with .send().await.
§Example
let resp = client
.delete("https://api.example.com/resource/42")
.header("authorization", "Bearer token")
.send()
.await?;Trait Implementations§
Source§impl Clone for HttpClient
impl Clone for HttpClient
Source§fn clone(&self) -> HttpClient
fn clone(&self) -> HttpClient
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for HttpClient
impl !RefUnwindSafe for HttpClient
impl Send for HttpClient
impl Sync for HttpClient
impl Unpin for HttpClient
impl UnsafeUnpin for HttpClient
impl !UnwindSafe for HttpClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> ServiceExt for T
impl<T> ServiceExt for T
Source§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
Source§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
Source§fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
Source§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
x-request-id as the header name. Read moreSource§fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
Source§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
x-request-id as the header name. Read moreSource§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
413 Payload Too Large responses. Read more