Rust初学者,边学边写的OSS的sdk,欢迎批评指正 :)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: `Rust`语言编写的阿里云OSS的SDK,依据官方文档并参考了其他语言的实现。

XT - Aliyun OSS SDK

Rust语言编写的阿里云OSS的SDK,依据官方文档并参考了其他语言的实现。

  • 基于tokio-rs异步运行时与流行的reqwest库实现.
  • 尽量完整的OSS数据结构描述(structenum).
  • Builder设计模式的传参风格.
  • 实现常用的大部分API.
  • 完整Examples演示.

链接

xtoss-1.png

[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 ID
  • access_key_secret 通过阿里云控制台创建的AccessKey Secret
  • sts_token 使用临时授权方式
  • bucket 通过控制台或PutBucket创建的Bucket
  • endpoint OSS访问域名。
  • region Bucket所在的区域,默认值为oss-cn-hangzhou
  • internal 是否使用阿里云内网访问,默认值为false
  • cname 是否支持上传自定义域名,默认值为false
  • is_request_pay Bucket是否开启请求者付费模,默认值为false
  • secure 设置secure为true,则使用HTTPS;设置secure为false,则使用HTTP
  • timeout 超时时间,默认值为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方法与参数构建

xtoss-2.png

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>) -> String
  • fn local_to_gmt(local_datetime: DateTime<Local>) -> String
  • fn options_from_env() -> oss::Options<'static>
  • fn oss_file_md5
  • fn oss_md5
  • struct 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中告知。


附录:实现的Api

下面是计划中要实现的Api,★ 已经实现 ☆ 未实现.

关于Service/Region

Bucket - 基础操作

合规保留策略(WORM)

Bucket 权限控制(ACL)

Bucket 生命周期(Lifecycle)

Bucket 传输加速(TransferAcceleration)

Bucket 版本控制(Versioning)

Bucket 授权策略(Policy)

Bucket 日志管理(Logging)

Bucket 静态网站(Website)

Bucket 防盗链(Referer)

Bucket 标签(Tags)

Bucket 加密(Encryption)

Bucket 请求者付费(RequestPayment)

Bucket 跨域资源共享(CORS)

Bucket 自定义域名(CNAME)

Bucket 图片样式(Style)

Object 基础操作 Stand

Object 分片上传(MultipartUpload)

Object 权限控制(ACL)

Object 软链接(Symlink)

Object 标签(Tagging)

关于LiveChannel的操作

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
存储 JavaScript 前端开发
oss使用SDK上传文件
oss使用SDK上传文件
128 2
|
8月前
|
开发工具 对象存储 Python
使用Python的SDK从OSS中下载指定日期的所有文件
使用Python的SDK从OSS中下载指定日期的所有文件
210 1
|
10天前
|
存储 移动开发 前端开发
对象存储oss使用问题之OSS SDK .net 使用下载例程报错如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
25 0
|
2月前
|
对象存储
阿里云oss-cloud-sdk-springboot3兼容问题
阿里云oss-cloud-sdk-springboot3兼容问题
76 0
|
4月前
|
存储 DataWorks 开发工具
在DataWorks中,可以使用Python SDK操作阿里云OSS存储服
在DataWorks中,可以使用Python SDK操作阿里云OSS存储服
136 1
|
10月前
|
SQL 存储 监控
通过sdk查看oss投递(新版)延迟情况最佳实践
在投递任务中,日志服务会将运行日志写入到给定的logstore中,因而可以使用SDK来查看投递任务的当前状态,并进行批量查询,以了解多个Project和投递任务的状态。下面以查看oss投递的延迟为例,介绍客户提供操作步骤和常见的使用场景,以帮助客户更加方便地监控和管理投递任务。
通过sdk查看oss投递(新版)延迟情况最佳实践
|
5天前
|
JavaScript Java Maven
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
289 0
|
6月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
148 0
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0

相关产品

  • 对象存储