21 个版本

1.0.0-pre-release.42024 年 8 月 6 日
1.0.0-pre-release.22024 年 6 月 29 日
0.3.6 2024 年 8 月 23 日
0.3.4 2024 年 7 月 12 日
0.1.7 2024 年 3 月 26 日

#89 in Web 编程

Download history 455/week @ 2024-05-03 441/week @ 2024-05-10 668/week @ 2024-05-17 369/week @ 2024-05-24 535/week @ 2024-05-31 339/week @ 2024-06-07 499/week @ 2024-06-14 596/week @ 2024-06-21 510/week @ 2024-06-28 1010/week @ 2024-07-05 751/week @ 2024-07-12 404/week @ 2024-07-19 721/week @ 2024-07-26 1279/week @ 2024-08-02 939/week @ 2024-08-09 864/week @ 2024-08-16

3,871 每月下载量
用于 3 crates

MIT/Apache

315KB
5K SLoC

Apistos − 文档 最新版本 构建状态 依赖状态

一个暴露 OAS 3.0 模型以及类似于 paperclip 的 actix-web 包装器的 OpenAPI 文档工具。

Apistos 由以下 Crates 组成

查看我们的 示例项目

Apistos 是什么意思

Apistos(发音为 /a.p.i.stos/)是 Héphaïstos(希腊神赫淮斯托斯,铁匠、木匠、工匠、冶金之神,一些人认为也可以视为技术之神)和 API(法语中发音为 /a.p.i/)之间的双关语。

Apistos

安装

[dependencies]
#schemars = "0.8"
# sadly we currently rely on a fork to fix multiple flatten for enums, related PR can be found here: https://github.com/GREsau/schemars/pull/264
schemars = { package = "apistos-schemars", version = "1.0.0-alpha.2" }
apistos = "1.0.0-pre-release.4"

用法示例

使用 apistos 类型包装您的常规 actix-web 应用程序。

这些类型中的大多数都是 actix-web 的直接替换类型。

use std::fmt::Display;
use actix_web::{App, HttpServer, ResponseError};
use actix_web::http::StatusCode;
use actix_web::middleware::Logger;
use actix_web::web::Json;
use apistos::actix::CreatedJson;
use apistos::api_operation;
use apistos::ApiComponent;
use apistos::ApiErrorComponent;
use apistos::app::OpenApiWrapper;
use apistos::spec::Spec;
use apistos::web::{post, resource, scope};
use apistos_models::info::Info;
use core::fmt::Formatter;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::error::Error;
use std::net::Ipv4Addr;

#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, ApiComponent)]
pub struct Test {
  pub test: String
}

#[derive(Serialize, Deserialize, Debug, Clone, ApiErrorComponent)]
#[openapi_error(
  status(code = 403),
  status(code = 404),
  status(code = 405, description = "Invalid input"),
  status(code = 409)
)]
pub enum ErrorResponse {
  MethodNotAllowed(String),
  NotFound(String),
  Conflict(String),
  Unauthorized(String),
}

impl Display for ErrorResponse {
  fn fmt(&self, _f: &mut Formatter<'_>) -> std::fmt::Result {
    todo!()
  }
}

impl ResponseError for ErrorResponse {
  fn status_code(&self) -> StatusCode {
    todo!()
  }
}

#[api_operation(
  tag = "pet",
  summary = "Add a new pet to the store",
  description = r###"Add a new pet to the store
    Plop"###,
  error_code = 405
)]
pub(crate) async fn test(
  body: Json<Test>,
) -> Result<CreatedJson<Test>, ErrorResponse> {
  Ok(CreatedJson(body.0))
}

#[actix_web::main]
async fn main() -> Result<(), impl Error> {
  HttpServer::new(move || {
    let spec = Spec {
      info: Info {
        title: "An API".to_string(),
        version: "1.0.0".to_string(),
        ..Default::default()
      },
      ..Default::default()
    };

    App::new()
        .document(spec)
        .wrap(Logger::default())
        .service(scope("/test")
            .service(
              resource("")
                  .route(post().to(test))
            )
        )
        .build("/openapi.json")
  })
      .bind((Ipv4Addr::UNSPECIFIED, 8080))?
      .run()
      .await
}

查看完整示例,请参阅 示例 petstore

功能标志

名称 描述 额外依赖项
query(默认) 启用文档化 actix_web::web::Query
actix(默认) 启用文档化来自 actix 的类型
lab_query 启用文档化 actix_web_lab::extract::Query actix-web-lab
garde 通过 garde 启用输入验证 garde
actix-web-grants 启用对 actix-web-grants 的支持 actix-web-grants
rapidoc 启用 RapiDoc 提供生成的 openapi 文件
redoc 启用 Redoc 提供生成的 openapi 文件
swagger-ui 启用 Swagger UI 提供生成的 openapi 文件
qs_query 启用文档化来自 serde_qs 的类型 serde_qs
chrono 启用文档化来自 chrono 的类型 chrono
ipnetwork 启用文档化来自 ipnetwork 的类型 ipnetwork
multipart 启用文档化来自 actix-multipart 的类型 actix-multipart
rust_decimal 启用文档化来自 rust_decimal 的类型 rust_decimal
uuid 启用文档化来自 uuid 的类型 uuid
url 启用文档化来自 url 的类型 url
extra 启用 chronomultipartrust_decimaluuidurl 功能 所有之前的特性

下一步是什么

  • 使用ApiErrorComponent派生宏处理错误模式

替代方案

Crate 关键差异
paperclip Paperclip与本项目类似,但生成Swagger v2文档。Paperclip还提供了一种从Swagger v2文档生成rust代码的工具。
utoipa Utoipa-actix集成依赖于actix web宏进行路由定义。最初,我们计划依赖utoipa进行OAS类型和模式派生,但现在utoipa不支持我们预期的泛型结构体
okapi 与schemars类似,也是基于schemars(由schemars的创始人维护),但没有与actix集成。

文章

  • 可以在medium上找到公告文章。它充当Apistos的教程。

关于我们

Apistos由Netwo提供。

我们使用此crate满足内部需求,因此致力于其维护,但我们无法提供任何额外的保证。请自行承担风险使用。

虽然我们不会投资我们不需要的功能,但我们乐于接受您可能提出的任何pull request。

我们是一家总部位于法国的全远程电信行业公司。如果您想了解更多信息,请随时访问我们的职业页面

依赖关系

~20–34MB
~615K SLoC