#openapi #swagger-ui #salvo #async #http

已删除 soai

salvo的OpenApi支持

0.1.0 2022年12月13日

#9#swagger-ui

MIT/Apache

20KB
204

soai OpenApi

soai的快速且类型安全的OpenApi实现。


soai 允许您轻松实现符合 OpenApi v3 规范的API。它使用过程宏生成大量样板代码,这样您只需关注更重要的业务实现。

特性

  • 类型安全 如果您的代码可以编译,则它完全符合 OpenApi v3 规范。
  • Rustfmt友好 不要创建任何不符合Rust语法规范的DSL。
  • IDE友好 由过程宏生成的任何代码都不会直接使用。
  • 最小开销 所有生成的代码都是必要的,几乎没有开销。

包特性

为了避免编译未使用的依赖项,soai限制了某些特性,其中一些默认禁用

特性 描述
chrono chrono 集成。
swagger-ui 添加swagger UI支持
rapidoc 添加RapiDoc UI支持
redoc 添加Redoc UI支持
email 支持电子邮件字符串
hostname 支持主机名字符串
uuid uuid 集成
url url 集成
bson bson 集成
rust_decimal rust_decimal 集成
static-files 支持静态文件响应

安全性

此包使用 #![forbid(unsafe_code)] 确保所有内容都在100%安全的Rust中实现。

示例

use soai::{listener::TcpListener, Route};
use soai::{param::Query, payload::PlainText, OpenApi, OpenApiService};

struct Api;

#[OpenApi]
impl Api {
    #[oai(path = "/hello", method = "get")]
    async fn index(&self, name: Query<Option<String>>) -> PlainText<String> {
        match name.0 {
            Some(name) => PlainText(format!("hello, {}!", name)),
            None => PlainText("hello!".to_string()),
        }
    }
}

#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
    let api_service =
        OpenApiService::new(Api, "Hello World", "1.0").server("https://127.0.0.1:3000/api");
    let ui = api_service.swagger_ui();
    let app = Route::new().nest("/api", api_service).nest("/", ui);

    soai::Server::new(TcpListener::bind("127.0.0.1:3000"))
        .run(app)
        .await
}

此功能需要启用。可以通过在 Cargo.toml 文件中添加功能来实现。

[dependencies]
soai = "1.3.29"
soai = { version = "1.3.29", features = ["swagger-ui"]}
tokio = { version = "1", features = ["full"] }

运行示例

在浏览器中打开 https://127.0.0.1:3000/,您将看到包含这些Api定义的 Swagger UI

> cargo run --example hello_world

> curl https://127.0.0.1:3000
hello!

> curl https://127.0.0.1:3000\?name\=chris
hello, chris!        

MSRV

此crate支持的最小Rust版本是 1.56.1

贡献

🎈 感谢您的帮助,让我们改进了项目!我们非常高兴有您加入!

许可证

根据以下任一许可证授权:

贡献

除非您明确声明,否则您有意提交以包含在soai中的任何贡献,均应按Apache许可证授权,不附加任何额外条款或条件。

依赖

~5.5–9MB
~154K SLoC