Skip to main content

RequestBuilder

Struct RequestBuilder 

Source
pub struct RequestBuilder { /* private fields */ }
Expand description

HTTP request builder with fluent API

Created by [HttpClient::get], [HttpClient::post], etc. Supports chaining headers and body configuration before sending with send().

§URL Construction

This crate does not provide query-string composition. Build your URL externally (e.g. via url::Url) and pass the final string to HttpClient:

use url::Url;
use modkit_http::HttpClient;

let mut url = Url::parse("https://api.example.com/users")?;
url.query_pairs_mut()
    .append_pair("page", "1")
    .append_pair("limit", "10");

let client = HttpClient::builder().build()?;
let resp = client.get(url.as_str()).send().await?;

§Example

use modkit_http::HttpClient;

let client = HttpClient::builder().build()?;

// Simple GET
let resp = client
    .get("https://api.example.com/users")
    .send()
    .await?;

// POST with JSON body
let resp = client
    .post("https://api.example.com/users")
    .header("x-request-id", "123")
    .json(&NewUser { name: "Alice" })?
    .send()
    .await?;

// POST with form body
let resp = client
    .post("https://auth.example.com/token")
    .header("authorization", "Basic xyz")
    .form(&[("grant_type", "client_credentials")])?
    .send()
    .await?;

Implementations§

Source§

impl RequestBuilder

Source

pub fn header(self, name: &str, value: &str) -> Self

Add a single header to the request

§Example
let resp = client
    .get("https://api.example.com")
    .header("authorization", "Bearer token")
    .header("x-request-id", "abc123")
    .send()
    .await?;
Source

pub fn headers(self, headers: Vec<(String, String)>) -> Self

Add multiple headers to the request

§Example
let resp = client
    .get("https://api.example.com")
    .headers(vec![
        ("authorization".to_owned(), "Bearer token".to_owned()),
        ("x-request-id".to_owned(), "abc123".to_owned()),
    ])
    .send()
    .await?;
Source

pub fn json<T: Serialize>(self, body: &T) -> Result<Self, HttpError>

Set request body as JSON

Serializes the value using serde_json and sets Content-Type to application/json. unless a Content-Type header was already provided.

§Errors

Returns Err(HttpError::Json) if serialization fails.

§Example
#[derive(Serialize)]
struct CreateUser { name: String }

let resp = client
    .post("https://api.example.com/users")
    .json(&CreateUser { name: "Alice".into() })?
    .send()
    .await?;
Source

pub fn form(self, fields: &[(&str, &str)]) -> Result<Self, HttpError>

Set request body as form URL-encoded

Serializes the fields and sets Content-Type to application/x-www-form-urlencoded. unless a Content-Type header was already provided.

§Errors

Returns Err(HttpError::FormEncode) if encoding fails.

§Example
let resp = client
    .post("https://auth.example.com/token")
    .form(&[
        ("grant_type", "client_credentials"),
        ("client_id", "my-app"),
    ])?
    .send()
    .await?;
Source

pub fn body_bytes(self, body: Bytes) -> Self

Set request body as raw bytes

§Example
let resp = client
    .post("https://api.example.com/upload")
    .header("content-type", "application/octet-stream")
    .body_bytes(Bytes::from(file_contents))
    .send()
    .await?;
Source

pub fn body_string(self, body: String) -> Self

Set request body as a string

§Example
let resp = client
    .post("https://api.example.com/text")
    .header("content-type", "text/plain")
    .body_string("Hello, World!".into())
    .send()
    .await?;
Source

pub async fn send(self) -> Result<HttpResponse, HttpError>

Send the request and return the response

§Errors

Returns HttpError if:

  • Request building failed (invalid headers, URL, etc.)
  • URL scheme is invalid for the transport security mode
  • Network/transport error
  • Request timeout
  • Concurrency limit reached (Overloaded)
§Example
let resp = client
    .get("https://api.example.com/data")
    .send()
    .await?;

let data: MyData = resp.json().await?;

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ServiceExt for T

Source§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Decompress response bodies. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
Source§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. Read more
Source§

fn set_request_id<M>( self, header_name: HeaderName, make_request_id: M, ) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension. Read more
Source§

fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension, using x-request-id as the header name. Read more
Source§

fn propagate_request_id( self, header_name: HeaderName, ) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses. Read more
Source§

fn propagate_x_request_id(self) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses, using x-request-id as the header name. Read more
Source§

fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>
where Self: Sized,

Intercept requests with over-sized payloads and convert them into 413 Payload Too Large responses. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more