Trait IntoResponse

pub trait IntoResponse {
    // Required method
    fn into_response(self) -> Response<Body>;
}
Expand description

Trait for generating responses.

Types that implement IntoResponse can be returned from handlers.

§Implementing IntoResponse

You generally shouldn’t have to implement IntoResponse manually, as axum provides implementations for many common types.

However it might be necessary if you have a custom error type that you want to return from handlers:

use axum::{
    Router,
    body::{self, Bytes},
    routing::get,
    http::StatusCode,
    response::{IntoResponse, Response},
};

enum MyError {
    SomethingWentWrong,
    SomethingElseWentWrong,
}

impl IntoResponse for MyError {
    fn into_response(self) -> Response {
        let body = match self {
            MyError::SomethingWentWrong => "something went wrong",
            MyError::SomethingElseWentWrong => "something else went wrong",
        };

        // it's often easiest to implement `IntoResponse` by calling other implementations
        (StatusCode::INTERNAL_SERVER_ERROR, body).into_response()
    }
}

// `Result<impl IntoResponse, MyError>` can now be returned from handlers
let app = Router::new().route("/", get(handler));

async fn handler() -> Result<(), MyError> {
    Err(MyError::SomethingWentWrong)
}

Or if you have a custom body type you’ll also need to implement IntoResponse for it:

use axum::{
    body,
    routing::get,
    response::{IntoResponse, Response},
    body::Body,
    Router,
};
use http::HeaderMap;
use bytes::Bytes;
use http_body::Frame;
use std::{
    convert::Infallible,
    task::{Poll, Context},
    pin::Pin,
};

struct MyBody;

// First implement `Body` for `MyBody`. This could for example use
// some custom streaming protocol.
impl http_body::Body for MyBody {
    type Data = Bytes;
    type Error = Infallible;

    fn poll_frame(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {
        // ...
    }
}

// Now we can implement `IntoResponse` directly for `MyBody`
impl IntoResponse for MyBody {
    fn into_response(self) -> Response {
        Response::new(Body::new(self))
    }
}

// `MyBody` can now be returned from handlers.
let app = Router::new().route("/", get(|| async { MyBody }));

Required Methods§

fn into_response(self) -> Response<Body>

Create a response.

Implementations on Foreign Types§

§

impl IntoResponse for &'static str

§

impl IntoResponse for &'static [u8]

§

impl IntoResponse for Cow<'static, str>

§

impl IntoResponse for Cow<'static, [u8]>

§

impl IntoResponse for ()

§

impl IntoResponse for Box<str>

§

impl IntoResponse for Box<[u8]>

§

impl IntoResponse for String

§

impl IntoResponse for Vec<u8>

§

impl<K, V, const N: usize> IntoResponse for [(K, V); N]

§

impl<R> IntoResponse for (Parts, R)
where R: IntoResponse,

§

impl<R> IntoResponse for (Response<()>, R)
where R: IntoResponse,

§

impl<R> IntoResponse for (StatusCode, R)
where R: IntoResponse,

§

impl<R> IntoResponse for (R,)
where R: IntoResponse,

§

impl<R, T1> IntoResponse for (Parts, T1, R)

§

impl<R, T1> IntoResponse for (Response<()>, T1, R)

§

impl<R, T1> IntoResponse for (StatusCode, T1, R)

§

impl<R, T1> IntoResponse for (T1, R)

§

impl<R, T1, T2> IntoResponse for (Parts, T1, T2, R)

§

impl<R, T1, T2> IntoResponse for (Response<()>, T1, T2, R)

§

impl<R, T1, T2> IntoResponse for (StatusCode, T1, T2, R)

§

impl<R, T1, T2> IntoResponse for (T1, T2, R)

§

impl<R, T1, T2, T3> IntoResponse for (Parts, T1, T2, T3, R)

§

impl<R, T1, T2, T3> IntoResponse for (Response<()>, T1, T2, T3, R)

§

impl<R, T1, T2, T3> IntoResponse for (StatusCode, T1, T2, T3, R)

§

impl<R, T1, T2, T3> IntoResponse for (T1, T2, T3, R)

§

impl<R, T1, T2, T3, T4> IntoResponse for (Parts, T1, T2, T3, T4, R)

§

impl<R, T1, T2, T3, T4> IntoResponse for (Response<()>, T1, T2, T3, T4, R)

§

impl<R, T1, T2, T3, T4> IntoResponse for (StatusCode, T1, T2, T3, T4, R)

§

impl<R, T1, T2, T3, T4> IntoResponse for (T1, T2, T3, T4, R)

§

impl<R, T1, T2, T3, T4, T5> IntoResponse for (Parts, T1, T2, T3, T4, T5, R)

§

impl<R, T1, T2, T3, T4, T5> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, R)

§

impl<R, T1, T2, T3, T4, T5> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, R)

§

impl<R, T1, T2, T3, T4, T5> IntoResponse for (T1, T2, T3, T4, T5, R)

§

impl<R, T1, T2, T3, T4, T5, T6> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, R)

§

impl<R, T1, T2, T3, T4, T5, T6> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, R)

§

impl<R, T1, T2, T3, T4, T5, T6> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, R)

§

impl<R, T1, T2, T3, T4, T5, T6> IntoResponse for (T1, T2, T3, T4, T5, T6, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> IntoResponse for (Parts, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> IntoResponse for (Response<()>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> IntoResponse for (StatusCode, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R)

§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> IntoResponse for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R)

§

impl<const N: usize> IntoResponse for &'static [u8; N]

§

impl<const N: usize> IntoResponse for [u8; N]

Implementors§

§

impl IntoResponse for Infallible

§

impl IntoResponse for MultipartRejection

§

impl IntoResponse for BytesRejection

§

impl IntoResponse for ExtensionRejection

§

impl IntoResponse for FailedToBufferBody

§

impl IntoResponse for FormRejection

§

impl IntoResponse for JsonRejection

§

impl IntoResponse for MatchedPathRejection

§

impl IntoResponse for PathRejection

§

impl IntoResponse for QueryRejection

§

impl IntoResponse for RawFormRejection

§

impl IntoResponse for RawPathParamsRejection

§

impl IntoResponse for StringRejection

§

impl IntoResponse for WebSocketUpgradeRejection

§

impl IntoResponse for BytesMut

§

impl IntoResponse for Bytes

§

impl IntoResponse for Body

§

impl IntoResponse for InvalidBoundary

§

impl IntoResponse for MultipartError

§

impl IntoResponse for FailedToDeserializePathParams

§

impl IntoResponse for InvalidUtf8InPathParam

§

impl IntoResponse for FailedToDeserializeForm

§

impl IntoResponse for FailedToDeserializeFormBody

§

impl IntoResponse for FailedToDeserializeQueryString

§

impl IntoResponse for InvalidFormContentType

§

impl IntoResponse for InvalidUtf8

§

impl IntoResponse for JsonDataError

§

impl IntoResponse for JsonSyntaxError

§

impl IntoResponse for LengthLimitError

§

impl IntoResponse for MatchedPathMissing

§

impl IntoResponse for MissingExtension

§

impl IntoResponse for MissingJsonContentType

§

impl IntoResponse for MissingPathParams

§

impl IntoResponse for NestedPathRejection

§

impl IntoResponse for UnknownBodyError

§

impl IntoResponse for ConnectionNotUpgradable

§

impl IntoResponse for InvalidConnectionHeader

§

impl IntoResponse for InvalidProtocolPseudoheader

§

impl IntoResponse for InvalidUpgradeHeader

§

impl IntoResponse for InvalidWebSocketVersionHeader

§

impl IntoResponse for MethodNotConnect

§

impl IntoResponse for MethodNotGet

§

impl IntoResponse for WebSocketKeyHeaderMissing

§

impl IntoResponse for Parts

§

impl IntoResponse for Extensions

§

impl IntoResponse for HeaderMap

§

impl IntoResponse for StatusCode

§

impl IntoResponse for NoContent

§

impl IntoResponse for Redirect

§

impl<B> IntoResponse for Response<B>
where B: Body<Data = Bytes> + Send + 'static, <B as Body>::Error: Into<Box<dyn Error + Send + Sync>>,

§

impl<I, K, V> IntoResponse for AppendHeaders<I>

§

impl<K, V> IntoResponse for TryIntoHeaderError<K, V>
where K: Display, V: Display,

§

impl<S, E> IntoResponse for Sse<S>
where S: Stream<Item = Result<Event, E>> + Send + 'static, E: Into<Box<dyn Error + Send + Sync>>,

§

impl<T> IntoResponse for Result<T, ErrorResponse>
where T: IntoResponse,

§

impl<T> IntoResponse for Extension<T>
where T: Clone + Send + Sync + 'static,

§

impl<T> IntoResponse for Form<T>
where T: Serialize,

§

impl<T> IntoResponse for Json<T>
where T: Serialize,

§

impl<T> IntoResponse for Html<T>
where T: IntoResponse,

§

impl<T, E> IntoResponse for Result<T, E>

§

impl<T, U> IntoResponse for Chain<T, U>
where T: Buf + Unpin + Send + 'static, U: Buf + Unpin + Send + 'static,