Typed accept negotiation for axum, following RFC7231.
use axum::{extract::Json, response::{IntoResponse, Response}};
use axum_accept::AcceptExtractor;
use serde_json::json;
#[derive(AcceptExtractor, Default)]
enum Accept {
#[accept(mediatype="text/plain")]
TextPlain,
#[default]
#[accept(mediatype="application/json")]
ApplicationJson,
}
async fn my_handler(accept: Accept) -> Response {
match accept {
Accept::TextPlain => "hello world".into_response(),
Accept::ApplicationJson => Json(json!({ "content": "hello_world" })).into_response(),
}
}Setting a default is recommended as it indicates behaviour more explicitly in your code. This is how axum-accept behaves on edge cases:
| Accept | Has default | No default |
|---|---|---|
<empty> |
Default variant | HTTP 406 (Not Acceptable) |
*/* |
Default variant | First variant |
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.