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月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1432 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
4月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
安全 Go 开发工具
对象存储OSS产品常见问题之go语言SDK client 和 bucket 并发安全如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
141 9
|
6月前
|
存储 监控 开发工具
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
219 9
|
6月前
|
存储 移动开发 前端开发
对象存储oss使用问题之OSS SDK .net 使用下载例程报错如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
|
3月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
83 0
|
13天前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
42 1
|
23天前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
41 7
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
166 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
303 4

相关产品

  • 对象存储