7个版本
0.5.7 | 2024年3月1日 |
---|---|
0.5.6 |
|
0.5.5 | 2024年2月27日 |
0.4.4 |
|
0.1.0 |
|
#255 在 文件系统
每月 392次下载
385KB
9K SLoC
XT - 阿里云OSS SDK
Rust
语言编写的阿里云OSS的SDK,依据官方文档并参考了其他语言的实现。
- 基于
tokio-rs
异步运行时与流行的reqwest
库实现. - 尽量完整的OSS数据结构描述(
struct
、enum
). Builder
设计模式的传参风格.- 实现常用的大部分API.
- 完整
Examples
演示.
[dependencies]
tokio = {version = "1.36.0", features = ["full"]}
xt-oss = "0.5.7"
#example 可选 dirs = "5.0.1"
#example 可选 dotenv = "0.15.0"
#example 可选 serde_json = "1.0.114"
//! `cargo run --example api_region_describe -q`
//! 调用DescribeRegions接口查询所有支持地域或者指定地域对应的Endpoint信息,
use dotenv;
use std::process;
use xt_oss::{
oss::entities::region::RegionInfo,
prelude::*,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv::dotenv().ok();
// 从环境生成 oss::Options;
let options = util::options_from_env();
// builder oss::Options
// let options = oss::Options::new()
// .with_access_key_id("-- your access_key_id --")
// .with_access_key_secret("-- your access_key_secret --");
// 创建oss::Client
let client = oss::Client::new(options);
match client
.DescribeRegions()
// 可选参数
// .with_region("oss-us-east-1")
.execute()
.await
// 处理可能的reqwest错误
.unwrap_or_else(|reqwest_error| {
println!("reqweset error: {}", reqwest_error);
process::exit(-1);
}) {
// 请求正常返回结果
Ok(oss_data) => {
let regions: Vec<RegionInfo> = oss_data.content().region_info;
for e in regions {
println!("{:>20} | {}", e.region, e.internet_endpoint);
}
}
// 请求正常,返回oss错误消息
Err(error_message) => {
// let message = error_message.content();
println!("request id: {}", &error_message.request_id());
println!("oss error: {}", &error_message.content());
}
}
Ok(())
}
一、 Example
二、 Options
配置
access_key_id
通过阿里云控制台创建的AccessKey IDaccess_key_secret
通过阿里云控制台创建的AccessKey Secretsts_token
使用临时授权方式bucket
通过控制台或PutBucket创建的Bucketendpoint
OSS访问域名。region
Bucket所在的区域,默认值为oss-cn-hangzhouinternal
是否使用阿里云内网访问,默认值为falsecname
是否支持上传自定义域名,默认值为falseis_request_pay
Bucket是否开启请求者付费模,默认值为falsesecure
设置secure为true,则使用HTTPS;设置secure为false,则使用HTTPtimeout
超时时间,默认值为60秒
当
cname
为true时,endpoint
,bucket
为必填,否则产生panic错误. 当internal为true时,忽略cname与endpoint 无论是否使用cname正确的设置region(location)与bucket
构建方式生成oss::Options
use xt_oss::prelude::*;
// 构建方式
let options = oss::Options::new()
.with_access_key_id("access_key_id")
.with_access_key_secret("access_key_secret")
.with_region("oss-cn-shanghai")
.with_bucket("xtoss-ex")
.with_secret(true)
.with_internal(false);
let root_url = "https://oss-cn-hangzhou.aliyuncs.com";
let base_url = "https://xtoss-ex.oss-cn-shanghai.aliyuncs.com";
assert_eq!(options.root_url(), root_url);
assert_eq!(options.base_url(), base_url);
let client = oss::Client::new(options);
环境变量生成oss::Options,格式参见 .env.example
use xt_oss::prelude::*;
// ...
dotenv::dotenv().ok();
let options = util::options_from_env();
let client = oss::Client::new(options);
// ...
三、 Api方法与参数构建
api方法命名遵循官方文档,例如 ListObjectsV2
,DescribeRegions
,熟悉官方文档并结合 代码提示将给库的使用带来方便.
- 参数构建分为简单方式,直接在方法内传参数例如
.HeadObject("mp3/Audio_0.4mb.mp3")
- with_ 传参数,例如:.
PutSymlink("tmp/test.txt").with_symlink_target("target.txt")
- 参数builder构建 例如
// 构建参数
let index_document = IndexDocumentBuilder::new()
.with_suffix("index.html")
.with_support_sub_dir(true)
.with_type(0)
.build();
let error_document = ErrorDocumentBuilder::new()
.with_http_status(StatusCode::NOT_FOUND)
.with_key("error.html")
.build();
let config = WebsiteConfigurationBuilder::new()
.with_index_document(index_document)
.with_error_document(error_document)
// .with_routing_rules(rules)
.build();
// 发出请求
let result = client
.PutBucketWebsite()
.with_config(config)
.execute()
.await
// ...
四、 返回与错误处理
pub type ApiResponse<T> = Result<ApiData<T>, ApiData<ErrorMessage>>;
pub type ApiResult<T = ()> = Result<ApiResponse<T>, reqwest::Error>;
//...
match client
.GetObjectTagging("excel/Spreadsheet-1000-rows.xls")
.execute()
.await
{
Ok(Ok(data)) => {
// data:ApiData<Tagging>
println!("{}", data.request_id());
println!("{:#?}", data.headers());
println!("{:#?}", data.content());
}
Ok(Err(message)) => {
// message: ApiData<ErrorMessage>
println!("{}", message.request_id());
println!("{:#?}", message.headers());
println!("{:#?}", message.content());
}
Err(reqwest_error) => println!("{}", reqwest_error),
}
//...
五、util提供一些工具方法
fn utc_to_gmt(datetime:DateTime<Utc>) ->字符串
fn local_to_gmt(local_datetime: DateTime<本地>) ->字符串
fn options_from_env() -> oss::选项<'静态>
fn oss_file_md5
fn oss_md5
结构体 ByteRange
关于ByteRange
提供了HTTP Range构造方法
assert_eq!(ByteRange::new().to_string(), "bytes=0-");
assert_eq!(ByteRange::new().with_amount(500).to_string(), "bytes=0-499");
assert_eq!(ByteRange::new().with_amount(-500).to_string(), "bytes=-500");
assert_eq!(ByteRange::new().with_start(100).to_string(), "bytes=100-");
// 通过元组生成
assert_eq!(ByteRange::from((100, 500)).to_string(), "bytes=100-599");
assert_eq!(ByteRange::from((100, -500)).to_string(), "bytes=0-99");
assert_eq!(ByteRange::from((100, -50)).to_string(), "bytes=50-99");
第六、TODO
- 完成剩下的API,修复bug
- 逐步完善文档
- 提供一些开箱即用的utils功能
第七、欢迎提bug和需求
欢迎大家提出bug报告和功能需求。如果你在使用过程中遇到了任何问题或者有任何改进的建议,都可以在Issues中告知。
- 邮箱:
isme.sun@icloud.com
- 微信:
ismeSun
- github:
xt-oss
附录:实现的API
下面是计划中要实现的API,★ 已实现 ☆ 未实现。
关于Service/Region
Bucket - 基础操作
- ★
PutBucket
- ★
DeleteBucket
- ★
ListObjects
- ★
ListObjectsV2
- ★
GetBucketInfo
- ★
GetBucketLocation
- ★
GetBucketStat
合规保留策略(WORM)
★ AbortBucketWorm
★ ListStorageClasses
桶策略(Policy)
★ DeleteBucketPolicy
★ DeleteBucketQuota
★ GetBucketVersioning
★ AbortMultipartUpload
★ RestoreObject
★ DeleteBucketLogging
★ ListBucketReplication
★ PutBucketLifecycle
★ PutBucketCORS
★ ListBucketNotification
- ★
PutBucketNotification
- ★
DeleteBucketNotification
- ★
ListBucketTagging
- ★
PutBucketTagging
- ★
DeleteBucketTagging
★ ListBucketInventory
对象基本操作 Stand
- ★
PutObject
- ★
GetObject
- ★
CopyObject
- ★
AppendObject
- ★
DeleteObject
- ★
DeleteMultipleObjects
- ★
HeadObject
- ★
GetObjectMeta
对象分片上传(MultipartUpload)
- ★
InitiateMultipartUpload
- ★
UploadPart
- ★
UploadPartCopy
- ★
CompleteMultipartUpload
- ★
AbortMultipartUpload
- ★
ListMultipartUploads
- ★
ListParts
对象权限控制(ACL)
对象软链接(Symlink)
对象标签(Tagging)
关于LiveChannel的操作
依赖项
~11–27MB
~367K SLoC