Project Icon

apistos

Rust 生态系统中的 OpenAPI 3.0 文档生成工具

Apistos 是一个为 Rust 生态系统设计的 OpenAPI 文档工具,主要用于生成 OpenAPI 3.0 规范文档。该工具为 actix-web 框架提供了封装,类似于 paperclip 的功能。Apistos 由多个子模块组成,包括核心模型、宏工具和插件系统等。它支持输入验证、权限控制,并能与 RapiDoc、Redoc 和 Swagger UI 等文档展示工具无缝集成。Apistos 简化了 API 文档的生成流程,适用于各类 Rust Web 开发项目。

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

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

Apistos由以下crate组成:

查看我们的示例项目

Apistos的含义

Apistos(发音为/a.p.i.stos/)是赫菲斯托斯(Ἥφαιστος,希腊神话中的铁匠、木匠、工匠和冶金之神,也被一些人视为技术之神)和API(在法语中发音为/a.p.i/)之间的文字游戏。

Apistos

安装

[dependencies]
#schemars = "0.8"
# 遗憾的是,我们目前依赖于一个分支来修复枚举的多重展平问题,相关PR可以在这里找到:https://github.com/GREsau/schemars/pull/264
schemars = { package = "apistos-schemars", version = "0.8" }
apistos = "0.3"

使用示例

使用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
}

完整示例请参见示例宠物商店

功能标志

名称描述额外依赖
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
multipart启用actix-multipart类型的文档生成actix-multipart
rust_decimal启用rust_decimal类型的文档生成rust_decimal
uuid启用uuid类型的文档生成uuid
url启用url类型的文档生成url
extras启用chronomultipartrust_decimaluuidurl功能所有前述功能的依赖

未来计划

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

替代方案

Crate主要区别
paperclipPaperclip与本项目类似,但生成Swagger v2文档。Paperclip还提供了一个从Swagger v2文档生成rust代码的工具。
utoipaUtoipa-actix集成依赖于actix web macros进行路由定义。起初,我们计划依赖utoipa来处理OAS类型和模式推导,但目前utoipa不支持我们预期的泛型结构
okapi非常相似,同样基于schemars(并由schemars的创始人维护),但未与actix集成。

文章

关于我们

apistos由Netwo提供。

我们将这个crate用于我们的内部需求,因此我们致力于维护它,但我们不能提供任何额外的保证。使用时请自行承担风险。

虽然我们不会投资于我们不需要的任何功能,但我们欢迎接受你可能提出的任何拉取请求。

我们是一家总部位于法国的全远程公司,在电信行业运营。如果你有兴趣了解更多,请随时访问我们的职业页面

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号