| Crates.io | ali-acs |
| lib.rs | ali-acs |
| version | 0.3.0 |
| created_at | 2025-12-29 06:44:26.175586+00 |
| updated_at | 2026-01-05 08:22:37.115397+00 |
| description | A type-safe, idiomatic Rust SDK for Alibaba Cloud services with complete protocol coverage |
| homepage | |
| repository | https://github.com/redforks/aliyun-rs |
| max_upload_size | |
| id | 2010089 |
| size | 965,043 |
一个类型安全、符合 Rust 惯用法的阿里云服务 SDK,提供完整的协议覆盖。
reqwest 和 async/await,高性能异步 I/OValue 和 OpenObject 类型,应对 API 变化的灵活性SMS(短信服务) - 完整实现,包含 56 个 API 端点:
OCR(文字识别) - 完整实现,支持多种识别场景:
[dependencies]
ali-acs = "0.1"
tokio = { version = "1", features = ["full"] }
use ali_acs::sms::{Connection, Endpoint};
use ali_acs::v3::AccessKeySecret;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 创建访问凭证
let access_key_id = "your_access_key_id";
let access_key_secret = "your_access_key_secret";
let app_key_secret = AccessKeySecret::new(access_key_id, access_key_secret);
// 2. 创建 SMS 连接
let conn = Connection::new(Endpoint::CnHangzhou, app_key_secret);
// 3. 构建请求(必要参数通过 ::new() 构造)
let req = ali_acs::sms::SendSms::new(
"13800138000", // 手机号码
"阿里云短信签名", // 签名名称
"SMS_123456789" // 模板CODE
)
// 可选参数使用链式方法设置
.template_param(r#"{"code":"1234"}"#.to_string())
.out_id("your-out-id".to_string());
// 4. 发送请求
let response = conn.send_sms(req).await?;
println!("短信发送成功,BizId: {}", response.biz_id());
Ok(())
}
use ali_acs::sms::*;
use ali_acs::v3::AccessKeySecret;
// 创建签名
let create_sign_req = CreateSmsSign::new("我的签名", SignSource::SelfBuilt)
.sign_source_list("["网站", "APP"]".to_string())
.remark("备注信息".to_string());
let sign_response = conn.create_sms_sign(create_sign_req).await?;
// 查询签名详情
let get_sign_req = GetSmsSign::new("签名名称");
let sign_detail = conn.get_sms_sign(get_sign_req).await?;
// 批量发送短信
let batch_req = SendBatchSms::new(
"签名名称",
"SMS_123456789",
"[\"13800138000\",\"13900139000\"]"
).template_param(r#"[{\"code\":\"1234\"},{\"code\":\"5678\"}]"#.to_string());
let batch_response = conn.send_batch_sms(batch_req).await?;
所有的 API 请求类型都遵循以下设计模式:
::new() 构造函数 - 确保关键参数不会遗漏derive_setters 宏生成流畅的 builder 模式// 必要参数:phone_numbers, sign_name, template_code
let req = SendSms::new("13800138000", "签名", "模板CODE")
// 可选参数:template_param
.template_param(r#"{"code":"1234"}"#.to_string())
// 可选参数:out_id
.out_id("custom-id".to_string());
所有的 API 响应类型都包含 Code 和 Message 字段(通过 CodeMessage 结构体):
pub struct SendSmsResponse {
pub code_message: CodeMessage, // 包含 Code 和 Message 字段
pub biz_id: Option<String>,
pub request_id: String,
}
// CodeMessage 结构定义
pub struct CodeMessage {
pub code: String, // API 响应码,如果 API 不返回则为空字符串
pub message: String, // API 响应消息,如果 API 不返回则为空字符串
}
设计说明:
Code 和 Message 字段code 和 message 为空字符串CodeMessage,确保 API 调用的一致性let response = conn.send_sms(req).await?;
// 检查响应码
if !response.code_message.code.is_empty() && response.code_message.code != "OK" {
return Err(response.code_message.message.into());
}
println!("BizId: {:?}", response.biz_id);
不同的阿里云产品使用独立的 Connection 结构体和 Endpoint 枚举,这是出于以下设计考虑:
2017-05-25)dysmsapi.aliyuncs.com)Connection 可以提供符合该服务语义的高层方法(如 send_sms()、create_sign())// SMS 服务
let sms_conn = sms::Connection::new(
sms::Endpoint::CnHangzhou, // SMS 特定的端点
app_key_secret
);
// ECS 服务(示例)
let ecs_conn = ecs::Connection::new(
ecs::Endpoint::CnHangzhou, // ECS 特定的端点
app_key_secret
);
// 编译错误:无法将 ECS 的 Request 用于 SMS Connection
// sms_conn.call(ecs_request); // ❌ 类型错误
对于嵌套结构的请求,SDK 支持 Flat 参数样式:
// 嵌套结构会被展开为 key.subkey=value 格式
// 例如:{"Config": {"Timeout": 30}} => Config.Timeout=30
支持数组类型的索引参数:
// 数组会被展开为 key.1=value1&key.2=value2 格式(1-indexed)
使用 Value 和 OpenObject 处理动态 API 字段:
use ali_acs::{Value, OpenObject};
let mut extra = OpenObject::new();
extra.insert("custom_field".to_string(), Value::String("value".to_string()));
MIT License