Progenitor:终极OpenAPI客户端生成器,让Rust API集成变得简单高效

Progenitor:终极OpenAPI客户端生成器,让Rust API集成变得简单高效

【免费下载链接】progenitor An OpenAPI client generator 【免费下载链接】progenitor 项目地址: https://gitcode.com/gh_mirrors/pr/progenitor

Progenitor是一个基于Rust的OpenAPI客户端生成器,它能将OpenAPI 3.0.x规范的API描述转换为类型安全的Rust客户端代码。通过利用Rust futures实现异步API调用和Streams处理分页接口,Progenitor为开发者提供了一种简单高效的方式来集成和使用RESTful API服务。

为什么选择Progenitor?

🌟 核心优势

Progenitor作为一款专业的OpenAPI客户端生成工具,具有以下显著特点:

  • 类型安全:生成的代码完全基于Rust类型系统,在编译时就能捕获大多数API使用错误
  • 异步支持:原生支持Rust异步编程模型,完美适配现代API交互需求
  • 多风格接口:提供位置参数和构建器两种API调用风格,满足不同编码习惯
  • 功能丰富:不仅生成客户端代码,还能创建CLI工具和httpmock测试辅助代码

🚀 适用场景

无论你是构建微服务、开发命令行工具,还是编写API测试,Progenitor都能提供有力支持:

  • 快速集成第三方OpenAPI服务
  • 为内部API生成统一的客户端库
  • 构建与API交互的命令行工具
  • 创建类型安全的API测试环境

快速开始:三种使用方式

Progenitor提供了灵活多样的使用方式,可根据项目需求和个人偏好选择最适合的方案。

1️⃣ 宏调用:最简单的集成方式

对于快速原型开发或小型项目,generate_api!宏是最简单直接的使用方式。只需在源代码中添加:

generate_api!("path/to/openapi_document.json");

然后在Cargo.toml中添加必要依赖:

[dependencies]
futures = "0.3"
progenitor = { git = "https://github.com/oxidecomputer/progenitor" }
reqwest = { version = "0.13", features = ["json", "query", "stream"] }
serde = { version = "1.0", features = ["derive"] }

宏调用方式支持多种自定义选项,如接口风格选择、标签处理方式和钩子函数等:

generate_api!(
    spec = "path/to/openapi_document.json",
    interface = Builder,
    tags = Separate,
    derives = [ schemars::JsonSchema ],
);

2️⃣ build.rs:更灵活的代码生成

对于需要更多控制权的项目,推荐使用build.rs构建脚本方式。这种方式不仅能让生成的代码可见,还支持生成CLI和httpmock辅助代码。

典型的build.rs文件如下:

fn main() {
    let src = "../sample_openapi/keeper.json";
    println!("cargo:rerun-if-changed={}", src);
    let file = std::fs::File::open(src).unwrap();
    let spec = serde_json::from_reader(file).unwrap();
    let mut generator = progenitor::Generator::default();

    let tokens = generator.generate_tokens(&spec).unwrap();
    let ast = syn::parse2(tokens).unwrap();
    let content = prettyplease::unparse(&ast);

    let mut out_file = std::path::Path::new(&std::env::var("OUT_DIR").unwrap()).to_path_buf();
    out_file.push("codegen.rs");

    std::fs::write(out_file, content).unwrap();
}

然后在源代码中包含生成的代码:

include!(concat!(env!("OUT_DIR"), "/codegen.rs"));

3️⃣ 静态 crate:独立发布的客户端库

如果需要将生成的客户端作为独立库发布或在多个项目间共享,Progenitor支持生成完整的Rust crate:

cargo install cargo-progenitor
cargo progenitor -i sample_openapi/keeper.json -o keeper -n keeper -v 0.1.0

这种方式能确保客户端代码的稳定性,避免因Progenitor更新带来的意外变化。

两种API调用风格

Progenitor支持两种不同的API调用风格,可根据API特点和个人偏好选择。

位置参数风格(默认)

位置参数风格生成的方法直接按顺序接受参数:

let result = client.instance_create(org, proj, body).await?;

这种风格代码简洁,参数传递直接明了,适合参数较少的API调用。

构建器风格

构建器风格提供了更流畅的API调用体验,支持链式调用和类型转换:

let result = client
    .instance_create()
    .organization_name("org")
    .project_name("proj")
    .body(body)
    .send()
    .await?;

构建器风格的优势在于:

  • 参数名显式指定,提高代码可读性
  • 支持类型自动转换
  • 可选参数可省略
  • 结构体类型也生成对应的构建器

要启用构建器风格,只需在生成设置中指定:

let settings = GenerationSettings::default()
    .with_interface(InterfaceStyle::Builder);

高级功能

🔧 自定义客户端配置

Progenitor生成的客户端支持自定义HTTP设置,如超时时间和默认头信息:

let client_with_custom_defaults = reqwest::ClientBuilder::new()
    .connect_timeout(Duration::from_secs(15))
    .timeout(Duration::from_secs(15))
    .default_headers(headers)
    .build()
    .unwrap();

let client = Client::new_with_client(baseurl, client_with_custom_defaults);

🧪 测试支持

Progenitor能生成与httpmock兼容的测试辅助代码,帮助创建类型安全的API模拟服务,大幅简化API测试过程。

📜 CLI生成

通过build.rs方式,Progenitor还可以为OpenAPI服务生成完整的命令行工具,快速实现API的命令行交互。

开始使用Progenitor

要开始使用Progenitor,首先克隆项目仓库:

git clone https://gitcode.com/gh_mirrors/pr/progenitor

然后根据前面介绍的三种方式之一,将Progenitor集成到你的项目中。项目提供了多个示例可参考:

结语

Progenitor作为一款强大的OpenAPI客户端生成器,为Rust开发者提供了简单高效的API集成方案。无论是小型项目还是大型应用,Progenitor都能显著减少手动编写API客户端的工作量,同时提高代码质量和类型安全性。

如果你正在使用Rust开发需要与RESTful API交互的应用,不妨尝试Progenitor,体验类型安全的API集成带来的便利!

【免费下载链接】progenitor An OpenAPI client generator 【免费下载链接】progenitor 项目地址: https://gitcode.com/gh_mirrors/pr/progenitor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值