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

actix-web-rest

使用 actix-web 构建RESTful API的定制的工具包

3 个版本 (破坏性更新)

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

#1052 in HTTP 服务器

自定义许可证

6KB

actix-web-rest - 使用 actix-web 构建 RESTful API 的定制的工具包。

该crate包含用于使用 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],打开一个 问题 或创建一个 拉取请求

🌠 展示您的支持

如果此项目对您有帮助,请给一颗 ⭐!

buy me a coffee

📜 许可证

MIT © Alexandre Negrel

依赖

~16–26MB
~465K SLoC