10个版本
0.0.12 | 2024年7月26日 |
---|---|
0.0.11 | 2024年7月14日 |
#440 在 编码
每月157次下载
58KB
1.5K SLoC
Axum Codec
Axum Web框架的体提取器。
功能
- 支持单个提取器进行各种格式的编码和解码。
- 提供对
axum::routing::method_routing
的包装,以自动根据指定的Accept
头部(如果失败则回退到Content-Type
,然后是启用的格式之一)以正确的格式编码响应。 - 提供属性宏(在
macros
功能下),可以将所有启用的格式添加到结构体/枚举。
待办事项
- 支持
bitcode
,bincode
,ciborium
,rmp
,toml
,serde_yaml
和serde_json
- 添加自定义
MethodRouter
以自动以正确的格式编码响应 - 添加宏以派生所有启用的格式
- 添加对
aide
的支持 - 添加对
validator
的支持 - 支持更多格式(欢迎问题和PR)
- 添加基准测试?
以下是一个快速示例,可以执行以下操作
- 从请求体以支持的所有格式之一解码
User
。 - 以支持的所有格式之一将
Greeting
编码到响应体。
use axum::{Router, response::IntoResponse};
use axum_codec::{
response::IntoCodecResponse,
routing::{get, post},
Codec, Accept,
};
// Shorthand for the following (assuming all features are enabled):
//
// #[derive(
// serde::Serialize, serde::Deserialize,
// bincode::Encode, bincode::Decode,
// bitcode::Encode, bitcode::Decode,
// )]
// #[serde(crate = "...")]
// #[bincode(crate = "...")]
//
// NOTE: `validator` does not support `#[validator(crate = "...)]` yet,
// so the dependency must be specified in your `Cargo.toml` if enabled (and using this macro).
#[axum_codec::apply(encode, decode)]
struct User {
name: String,
age: u8,
}
async fn me() -> Codec<User> {
Codec(User {
name: "Alice".into(),
age: 42,
})
}
/// A manual implementation of the handler above.
async fn manual_me(accept: Accept) -> impl IntoResponse {
Codec(User {
name: "Alice".into(),
age: 42,
})
.into_codec_response(accept.into())
}
#[axum_codec::apply(encode)]
struct Greeting {
message: String,
}
/// Specify `impl IntoCodecResponse`, similar to `axum`
async fn greet(Codec(user): Codec<User>) -> impl IntoCodecResponse {
Codec(Greeting {
message: format!("Hello, {}! You are {} years old.", user.name, user.age),
})
}
#[tokio::main]
async fn main() {
let app: Router = Router::new()
.route("/me", get(me).into())
.route("/manual", axum::routing::get(manual_me))
.route("/greet", post(greet).into());
let listener = tokio::net::TcpListener::bind(("127.0.0.1", 3000))
.await
.unwrap();
// axum::serve(listener, app).await.unwrap();
}
功能标志
macros
:启用axum_codec::apply
属性宏。json
*:启用JSON
支持。msgpack
:启用MessagePack
支持。bincode
:启用Bincode
支持。bitcode
:启用Bitcode
支持。cbor
:启用CBOR
支持。yaml
:启用YAML
支持。toml
:启用TOML
支持。aide
:启用对Aide
文档库的支持。validator
:启用对Validator
验证库的支持,在用Codec<T>
提取时验证所有输入。
- 默认启用。
许可证
双重许可,MIT或Apache许可证v2.0。
依赖项
~3-15MB
~188K SLoC