poem_openapi

Derive Macro ApiResponse

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

Define an 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
displayWhen converting a response to an error, the error message comes from the Display trait.boolY

§Item parameters

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

§Header parameters

AttributedescriptionTypeOptional
deprecatedHeader deprecatedStringY

§Extra header parameters

AttributedescriptionTypeOptional
nameHeader nameStringN
tyHeader 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", ty = "String"),
    header(name = "X-ExtraHeader-2", ty = "i32"),
)]
enum CreateUserResponse {
    #[oai(status = 200, header(name = "X-ExtraHeader-3", ty = "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!()
    }
}