Progenitor:终极OpenAPI客户端生成器,让Rust API集成变得简单高效
【免费下载链接】progenitor An OpenAPI client generator 项目地址: 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集成到你的项目中。项目提供了多个示例可参考:
- 宏使用示例:example-macro/
- WebAssembly示例:example-wasm/
- 测试用例:progenitor/tests/
结语
Progenitor作为一款强大的OpenAPI客户端生成器,为Rust开发者提供了简单高效的API集成方案。无论是小型项目还是大型应用,Progenitor都能显著减少手动编写API客户端的工作量,同时提高代码质量和类型安全性。
如果你正在使用Rust开发需要与RESTful API交互的应用,不妨尝试Progenitor,体验类型安全的API集成带来的便利!
【免费下载链接】progenitor An OpenAPI client generator 项目地址: https://gitcode.com/gh_mirrors/pr/progenitor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



