#response #axum #extractor #codec #format #writer #bincode

axum-codec

Axum的多编解码提取器和响应写入器

10个版本

0.0.12 2024年7月26日
0.0.11 2024年7月14日

#440编码

Download history 456/week @ 2024-07-06 247/week @ 2024-07-13 101/week @ 2024-07-20 48/week @ 2024-07-27 1/week @ 2024-08-03

每月157次下载

MIT/Apache

58KB
1.5K SLoC

Axum Codec

https://img.shields.io/crates/v/axum-codec https://img.shields.io/docsrs/axum-codec ci status

Axum Web框架的体提取器。

功能

  • 支持单个提取器进行各种格式的编码和解码。
  • 提供对 axum::routing::method_routing 的包装,以自动根据指定的 Accept 头部(如果失败则回退到 Content-Type,然后是启用的格式之一)以正确的格式编码响应。
  • 提供属性宏(在 macros 功能下),可以将所有启用的格式添加到结构体/枚举。

待办事项

  • 支持 bitcodebincodeciboriumrmptomlserde_yamlserde_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