pub struct ApiJson<T>(pub T);Expand description
A drop-in replacement for axum::Json whose extraction failures reject with an
ApiError JSON body instead of Axum’s default plain-text response.
As an extractor it deserializes the request body exactly like axum::Json, but on
failure it short-circuits the handler with (StatusCode, Json<ApiError>):
- malformed JSON ->
400 Bad Request, codeINVALID_JSON - well-formed JSON of the wrong shape ->
422 Unprocessable Entity, codeINVALID_BODY - missing or incorrect
Content-Type->415 Unsupported Media Type, codeUNSUPPORTED_MEDIA_TYPE
The HTTP status is taken from Axum’s own rejection, so it stays correct as Axum evolves.
It also implements IntoResponse (serializing as 200 OK JSON), so it can be used as a
handler return type just like axum::Json.
Unlike ValidatedJson, ApiJson performs no validation and so
needs only the extract feature, not validator. Reach for ValidatedJson when you want
validator-based field validation as well.
Requires the extract feature.
§Example
use axum_api_kit::ApiJson;
use serde::Deserialize;
#[derive(Deserialize)]
struct CreateUser {
name: String,
}
// The body is deserialized before the handler runs; bad input becomes an ApiError body.
async fn create_user(ApiJson(user): ApiJson<CreateUser>) {
let _ = user.name;
}Tuple Fields§
§0: TTrait Implementations§
Source§impl<T, S> FromRequest<S> for ApiJson<T>
impl<T, S> FromRequest<S> for ApiJson<T>
Source§impl<T: Serialize> IntoResponse for ApiJson<T>
impl<T: Serialize> IntoResponse for ApiJson<T>
Source§fn into_response(self) -> Response
fn into_response(self) -> Response
Create a response.
Auto Trait Implementations§
impl<T> Freeze for ApiJson<T>where
T: Freeze,
impl<T> RefUnwindSafe for ApiJson<T>where
T: RefUnwindSafe,
impl<T> Send for ApiJson<T>where
T: Send,
impl<T> Sync for ApiJson<T>where
T: Sync,
impl<T> Unpin for ApiJson<T>where
T: Unpin,
impl<T> UnsafeUnpin for ApiJson<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for ApiJson<T>where
T: UnwindSafe,
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, S> Handler<IntoResponseHandler, S> for T
impl<T, S> Handler<IntoResponseHandler, S> for T
Source§fn call(
self,
_req: Request<Body>,
_state: S,
) -> <T as Handler<IntoResponseHandler, S>>::Future
fn call( self, _req: Request<Body>, _state: S, ) -> <T as Handler<IntoResponseHandler, S>>::Future
Call the handler with the given request.
Source§fn layer<L>(self, layer: L) -> Layered<L, Self, T, S>where
L: Layer<HandlerService<Self, T, S>> + Clone,
<L as Layer<HandlerService<Self, T, S>>>::Service: Service<Request<Body>>,
fn layer<L>(self, layer: L) -> Layered<L, Self, T, S>where
L: Layer<HandlerService<Self, T, S>> + Clone,
<L as Layer<HandlerService<Self, T, S>>>::Service: Service<Request<Body>>,
Apply a
tower::Layer to the handler. Read moreSource§fn with_state(self, state: S) -> HandlerService<Self, T, S>
fn with_state(self, state: S) -> HandlerService<Self, T, S>
Convert the handler into a
Service by providing the stateSource§impl<H, T> HandlerWithoutStateExt<T> for H
impl<H, T> HandlerWithoutStateExt<T> for H
Source§fn into_service(self) -> HandlerService<H, T, ()>
fn into_service(self) -> HandlerService<H, T, ()>
Convert the handler into a
Service and no state.Source§fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>
fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>
Convert the handler into a
MakeService and no state. Read moreSource§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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more