Expand description
§better-fetch
Typed HTTP client layer on top of reqwest, inspired by @better-fetch/fetch. This crate is not affiliated with the upstream TypeScript project.
§Quick flow
- Create a
Client(orClientBuilder) with a base URL. - Start a request with
Client::get/Client::post(flexibleRequestBuilder) orClient::call(typedEndpointroutes). - Configure path params, query, body, auth, retries on the builder.
- Execute with
RequestBuilder::send(bufferedResponse),RequestBuilder::send_stream(incrementalStreamingResponse),send_json, orEndpointRequestBuilder::send_json.
§Buffered vs streaming
send/send_json— full body in memory; hooks and retry predicates can read the body.send_stream—bytes_stream()from reqwest; useStreamingResponse::collectto buffer when needed. See thestreamingmodule for limits (hooks, custom retry predicates, Tower backend).
Use .get() when you want string paths and a typed JSON response (send_json::<T>()).
Use Client::call when method, path, params, query, and response are bound to an Endpoint type.
§Cargo features
The client always uses reqwest as the default HTTP backend. Enable crate features to turn on reqwest capabilities and optional APIs.
| Feature | Description |
|---|---|
json (default) | JSON bodies, send_json, custom JsonParserFn |
rustls-tls (default) | TLS via rustls (enable native-tls instead, not both) |
native-tls | TLS via the platform stack (do not combine with rustls-tls) |
multipart | RequestBuilder::multipart |
tower | Tower transport stack via ClientBuilder::transport_stack (implies rustls-tls) |
schema | SchemaRegistry route metadata |
openapi | OpenAPI 3.0 export from schema registry |
validate | Garde validation on JSON responses |
blocking, cookies | Passed through to reqwest |
macros | #[derive(EndpointParamsDerive)], #[derive(EndpointQueryDerive)] proc-macros |
See the repository README for full examples.
§Example (.get() — flexible path, typed response)
let client = Client::new("https://jsonplaceholder.typicode.com")?;
// send() returns Response for any status; json() fails on non-2xx
let todo: Todo = client
.get("/todos/:id")
.param("id", 1)
.send()
.await?
.json()
.await?;
// Or in one step:
let todo: Todo = client.get("/todos/:id").param("id", 1).send_json().await?;§Example (typed endpoint — method, path, params, response)
define_params!(GetTodoParams for "/todos/:id" { id: u64 });
struct GetTodo;
impl Endpoint for GetTodo {
const METHOD: Method = Method::GET;
const PATH: &'static str = "/todos/:id";
type Response = Todo;
type Params = GetTodoParams;
type Query = ();
}
let client = Client::new("https://jsonplaceholder.typicode.com")?;
let todo = client
.call::<GetTodo>()
.params(GetTodoParams { id: 1 })
.send_json()
.await?;Re-exports§
pub use auth::AsyncTokenProvider;pub use auth::Auth;pub use auth::TokenSource;pub use backend::HttpBackend;pub use backend::HttpBody;pub use backend::HttpRequest;pub use backend::HttpResponse;pub use backend::HttpStreamingResponse;pub use backend::ReqwestBackend;pub use client::Client;pub use client::ClientBuilder;pub use client::ClientConfig;pub use endpoint::Endpoint;pub use endpoint::EndpointParams;pub use endpoint::EndpointParamsInitial;pub use endpoint::EndpointQuery;pub use endpoint::EndpointRequestBuilder;pub use endpoint::NeedsParams;pub use endpoint::ParamsBuilderState;pub use endpoint::Ready;pub use error::Error;pub use error::TransportKind;pub use hooks::ErrorContext;pub use hooks::Hooks;pub use hooks::RequestContext;pub use hooks::ResponseContext;pub use hooks::StreamingResponseContext;pub use hooks::StreamingResponseMeta;pub use hooks::StreamingSuccessContext;pub use hooks::SuccessContext;pub use plugin::Plugin;pub use plugin::PluginRegistry;pub use plugin::PreparedRequest;pub use plugins::LoggerPlugin;pub use request::RequestBuilder;pub use response::Response;pub use retry::default_should_retry;pub use retry::parse_retry_after;pub use retry::RetryPolicy;pub use retry::ShouldRetryFn;pub use streaming::BodyStream;pub use streaming::StreamingResponse;pub use schema::EndpointSchema;schemapub use schema::SchemaRegistry;schemapub use openapi::OpenApiBuilder;openapipub use openapi::OpenApiComponents;openapipub use openapi::OpenApiDocument;openapipub use openapi::OpenApiInfo;openapipub use openapi::OpenApiOperation;openapipub use openapi::OpenApiSchemaRef;openapipub use openapi::OpenApiServer;openapipub use tower::BoxHttpService;towerpub use tower::ReqwestHttpService;towerpub use tower::ServiceBackend;tower
Modules§
- auth
- Authentication for clients and individual requests.
- backend
- HTTP transport abstraction.
- cancel
- Request cancellation (
CancellationToken) compatible with cooperative async abort. - client
- HTTP client, builder, and shared configuration.
- endpoint
- Typed API routes via the
Endpointtrait. - error
- Error types and helpers for HTTP, transport, hooks, and retries.
- hooks
- Lifecycle hooks for requests and responses.
- multipart
multipart - Re-export of reqwest multipart types (feature
multipart). multipart/form-data - openapi
openapi - OpenAPI 3.0 document builder (requires
openapifeature). - plugin
- Plugin hooks run after URL construction and auth, before request lifecycle hooks.
- plugins
- Built-in plugins.
- request
- Per-request fluent builder.
- response
- HTTP response wrapper with a fully buffered body.
- retry
- Retry policies for transport and HTTP failures.
- schema
schema - Schema registry for endpoint metadata (requires
schemafeature). - streaming
- Streaming HTTP responses (
send_stream). - tower
tower - Tower transport integration (
towerfeature).
Macros§
- define_
params - Defines path parameters for a route and implements
EndpointParams. - endpoint
- Defines a simple
Endpointwith optional typed params and query. - impl_
serde_ endpoint_ query json - Implements
EndpointQueryfor a serde-serializable query struct (featurejson).
Structs§
- Cancellation
Token - A token which can be used to signal a cancellation request to one or more tasks.
Enums§
- Query
Value - Query parameter value (scalar or repeated).
Functions§
- json_
parser json - Wraps a custom JSON parse function for use with
ClientBuilder::json_parser. - serde_
json_ parser json - Default parser using
serde_json::from_slice(same semantics as the fast path, as aJsonParserFn).
Type Aliases§
- Json
Parser Fn json - Parses response bytes into
serde_json::Valuebefore deserializing toT. - Result
- Result alias using
Error.
Derive Macros§
- Endpoint
Params Derive macros - Derives
EndpointParamsfor a struct with one field per:paramsegment in#[endpoint(path = "...")]. - Endpoint
Query Derive macros - Derives
EndpointQueryfor a serde-serializable query struct.