actix-web-schema 0.2.0

Schema-based development tools for actix-web with service and response macros
Documentation

actix-web-schema

Crates.io Documentation License: MIT

一个为 actix-web 提供模式化开发支持的工具库。通过派生宏简化路由定义和响应处理,让你的代码更加简洁和声明式。

特性

  • #[service] - 通过 trait 定义 HTTP 服务,自动生成路由配置
  • #[response] - 通过结构体定义响应格式,自动实现 Responder
  • 统一的响应格式包装({code: 0, data: ...}
  • 类型安全的路由定义
  • 零运行时开销

安装

Cargo.toml 中添加:

[dependencies]
actix-web-schema = "0.1"

快速开始

定义服务

使用 #[service] 宏将 trait 转换为 HTTP 服务:

use actix_web_schema::service;
use actix_web::web::Json;

/// 用户服务
#[service]
pub trait UserService {
    /// 获取用户信息
    #[get("/users/{id}")]
    async fn get_user(id: web::Path<u32>) -> Json<User>;

    /// 创建用户
    #[post("/users")]
    async fn create_user(user: Json<CreateUserRequest>) -> Json<User>;

    /// 删除用户
    #[delete("/users/{id}")]
    async fn delete_user(id: web::Path<u32>) -> Json<()>;
}

定义响应

使用 #[response] 宏定义响应结构:

use actix_web_schema::response;
use serde::Serialize;

#[response]
pub struct User {
    id: u32,
    name: String,
    email: String,
}

// User 自动实现 Responder,响应格式为:
// {"code": 0, "data": {"id": 1, "name": "...", "email": "..."}}

完整示例

use actix_web::{App, HttpServer, web};
use actix_web_schema::{service, response};
use serde::Serialize;

// 定义响应结构
#[response]
pub struct GreetingResponse {
    message: String,
}

// 定义服务
#[service]
pub trait HelloService {
    /// 问候接口
    #[get("/hello/{name}")]
    async fn hello(name: web::Path<String>) -> GreetingResponse {
        GreetingResponse {
            message: format!("Hello, {}!", name),
        }
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .service(HelloService)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

工作原理

#[service]

#[service] 宏处理 trait 定义:

  1. 为每个带有 HTTP 方法属性的方法生成路由配置
  2. 创建对应的 Service 结构体并实现 HttpServiceFactory
  3. 过滤掉 HTTP 方法属性,保持原有 trait 定义

#[response]

#[response] 宏处理结构体定义:

  1. 自动添加 #[derive(Serialize)]
  2. 实现 Responder trait
  3. 以统一格式 {"code": 0, "data": ...} 返回 JSON 响应

支持的 HTTP 方法

  • GET - #[get("/path")]
  • POST - #[post("/path")]
  • PUT - #[put("/path")]
  • DELETE - #[delete("/path")]
  • PATCH - #[patch("/path")]
  • HEAD - #[head("/path")]
  • OPTIONS - #[options("/path")]

项目结构

actix-web-schema/
├── actix-web-schema/         # 主库
│   └── src/lib.rs            # 导出宏
└── actix-web-schema-macro/   # 过程宏实现
    └── src/lib.rs            # 宏定义

License

MIT OR Apache-2.0

贡献

欢迎提交 Issue 和 Pull Request!

相关项目

  • actix-web - 强大的 Rust Web 框架
  • serde - 序列化/反序列化框架