logo
#[derive(ApiResponse)]
{
    // Attributes available to this derive:
    #[oai]
}
Expand description

Define a OpenAPI response.

Macro parameters

AttributedescriptionTypeOptional
bad_request_handlerSets a custom bad request handler, it can convert error to the value of the this response type.stringY
headerAdd an extra headerExtraHeaderY

Item parameters

AttributedescriptionTypeOptional
statusHTTP status code. If omitted, it is a default response type.u16Y
content_typeSpecify the content type.stringY
headerAdd an extra headerExtraHeaderY

Header parameters

AttributedescriptionTypeOptional
deprecatedHeader deprecatedStringY

Extra header parameters

AttributedescriptionTypeOptional
nameHeader nameStringN
typeHeader typeStringN
descriptionHeader descriptionStringY
deprecatedHeader deprecatedboolY

Example response headers

use poem_openapi::{payload::PlainText, ApiResponse};

#[derive(ApiResponse)]
enum CreateUserResponse {
    #[oai(status = 200)]
    Ok(#[oai(header = "X-Id")] String),
    #[oai(status = 201)]
    OkWithBody(PlainText<String>, #[oai(header = "X-Id")] String),
}

Example extra headers

use poem_openapi::ApiResponse;

#[derive(ApiResponse)]
#[oai(
    header(name = "X-ExtraHeader-1", type = "String"),
    header(name = "X-ExtraHeader-2", type = "i32"),
)]
enum CreateUserResponse {
    #[oai(status = 200, header(name = "X-ExtraHeader-3", type = "f32"))]
    Ok,
}

Example with bad request handler

use poem::Error;
use poem_openapi::{payload::PlainText, ApiResponse};

#[derive(ApiResponse)]
#[oai(bad_request_handler = "bad_request_handler")]
enum CreateUserResponse {
    /// Returns when the user is successfully created.
    #[oai(status = 200)]
    Ok,
    /// Returns when the user already exists.
    #[oai(status = 409)]
    UserAlreadyExists,
    /// Returns when the request parameters is incorrect.
    #[oai(status = 400)]
    BadRequest(PlainText<String>),
}

// Convert error to `CreateUserResponse::BadRequest`.
fn bad_request_handler(err: Error) -> CreateUserResponse {
    CreateUserResponse::BadRequest(PlainText(format!("error: {}", err.to_string())))
}

Example as an error type

use poem::Error;
use poem_openapi::{payload::{PlainText, Json}, ApiResponse, Object, OpenApi};

#[derive(Object)]
struct CreateUserRequest {
    username: String,
    nickname: String,
    email: String,
}

#[derive(ApiResponse)]
enum CreateUserResponse {
    /// Returns when the user is successfully created.
    #[oai(status = 200)]
    Ok,
}

#[derive(ApiResponse)]
enum CreateUserResponseError {
    /// Returns when the user already exists.
    #[oai(status = 409)]
    UserAlreadyExists,
    /// Returns when the request parameters is incorrect.
    #[oai(status = 400)]
    BadRequest(PlainText<String>),
}

struct UserApi;

#[OpenApi]
impl UserApi {
    /// Create a new user.
    #[oai(path = "/user", method = "post")]
    async fn create(
        &self,
        user: Json<CreateUserRequest>,
    ) -> Result<CreateUserResponse, CreateUserResponseError> {
        todo!()
    }
}