#web #actix-web #restful #toolkit #build #macro #opiniated

actix-web-rest-macros

使用 actix-web 构建 restful API 的有观点工具包

3 个版本 (破坏性更新)

0.3.0 2023 年 6 月 25 日
0.2.0 2023 年 6 月 17 日
0.1.0 2023 年 6 月 17 日

#36 in #restful


用于 actix-web-rest

自定义许可证

16KB
302

actix-web-rest - 使用 actix-web 构建 restful API 的有观点工具包。

此软件包包含用于加快使用 actix-web 开发 RESTful API 的实用工具

  • rest_error 属性宏

为什么?

⚡ 必须快速行动!

🧑‍🎓 学习过程宏。

入门

# Create a new project.
cargo init my_api && cd my_api

# Add actix-web-rest to your project.
cargo add actix-web-rest actix-web anyhow thiserror

然后使用以下内容覆盖 main.rs

use actix_web::{web, App, HttpResponse, HttpServer, ResponseError};
use actix_web_rest::{actix_web, http::StatusCode, rest_error};
use anyhow::anyhow;

#[allow(clippy::enum_variant_names)]
#[rest_error(internal_error)] // internal_error add an InternalError(#[from] anyhow::Error).
enum MyEndpointError {
    #[rest(status_code = StatusCode::OK)]
    #[error("error foo")]
    FooError,

    #[rest(status_code = StatusCode::OK)]
    #[error("error bar")]
    BarError,
}

async fn handler(path: web::Path<String>) -> Result<HttpResponse, impl ResponseError> {
    let path_param = path.into_inner();
    match path_param.as_ref() {
        "foo" => Err(MyEndpointError::FooError),
        "bar" => Err(MyEndpointError::BarError),
        _ => Err(MyEndpointError::from(anyhow!(
            "unexpected path params: {path_param}"
        ))),
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().route("/{error}", web::get().to(handler)))
        .bind(("127.0.0.1", 8080))?
        .run()
        .await
}
curl -i https://127.0.0.1:8080/foo
curl -i https://127.0.0.1:8080/bar
curl -i https://127.0.0.1:8080/baz

贡献

如果您想为 actix-web-rest 贡献以添加功能或改进代码,请联系我 [email protected],打开一个 问题 或发起一个 pull request

🌠 表达您的支持

如果此项目对您有所帮助,请给予 ⭐ 吧!

buy me a coffee

📜 许可证

MIT © Alexandre Negrel

依赖关系

~0.9–1.6MB
~32K SLoC