27 个版本 (17 个破坏性更新)
0.18.1 | 2024年5月6日 |
---|---|
0.18.0 | 2024年1月12日 |
0.17.0 | 2023年11月11日 |
0.15.0 | 2022年6月14日 |
0.1.0 | 2019年9月6日 |
#15 in 邮件
每月35次下载
在 4 个 Crates 中使用 (2 个直接使用)
10MB
213K SLoC
Dropbox SDK for Rust
Rust 对 Dropbox APIv2 的绑定,由 Stone 从官方规范生成。
用于生成代码的 Stone SDK 和 Dropbox API 规范分别位于 stone
和 dropbox-api-spec
子模块中。使用 git submodule init
和 git submodule update
来获取它们。
生成的代码存储在 src/generated
下以简化构建。要重新生成或更新它,运行 python generate.py
。这样做需要有效的 Python 环境和一些依赖项。有关详细信息,请参阅 Stone 文档。
此 SDK 的状态
此 SDK 尚未官方化。这意味着什么?
- 目前没有正式的 Dropbox 对 SDK 的支持。
- 错误可能得到修复,也可能不会修复。
- 可能并非所有 SDK 功能都得到实现。
然而,话虽如此,
- SDK 是可用的!
- 我们很高兴从社区获得反馈和/或拉取请求!有关更多信息,请参阅 贡献。
HTTP 客户端
要实际使用 API 调用,您需要一个 HTTP 客户端 -- 所有函数都将 HttpClient
类型实现作为其第一个参数。此特性位于 dropbox_sdk::client_trait::HttpClient
。实现此特性并将其作为客户端参数传递。
如果您不想自己实现,此SDK附带了一个可选的默认客户端,它使用ureq
和rustls
。要使用它,请使用带有default_client
功能标志进行构建,然后在dropbox_sdk::default_client
模块中将有一组客户端可供使用,对应于Dropbox使用的每种认证类型(见下文)。默认客户端需要一个Dropbox API令牌;您如何获取它取决于您和您的程序。请参阅examples/下的程序示例,以及oauth2模块中的辅助代码。
认证类型
Dropbox API有多种不同的认证类型。每个路由都需要一个与所需特定认证类型兼容的HTTP客户端。除了基础HttpClient
特质外,还需要实现一个标记特质来指定认证类型:其中之一为NoauthClient
、UserAuthClient
、TeamAuthClient
或AppAuthClient
。
默认客户端实现了所有这些(目前除了AppAuthClient
之外)。它们都共享一个公共实现,只是在请求中添加了不同的HTTP头。
功能标志
如果您只使用API的一部分,并且想缩短编译时间,您可以明确指定与您需要的命名空间相对应的功能。对于每个命名空间,都有一个对应的功能dbx_{ whatever}
。如果需要,可以使用update_manifest.py
脚本来更新功能集。例如,只需要'files'和'users'命名空间的示例:
[dependencies.dropbox-sdk]
version = "*"
default_features = false
features = ["dbx_files", "dbx_users"]
结果类型和错误
路由返回一个嵌套的结果类型:Result<Result<T, E>, dropbox_sdk::Error>
。外层的Result
是Err
,如果在实际发送请求的过程中出现错误,如网络I/O错误或请求数据序列化或反序列化失败。这个Result
的Ok
变体是另一个Result
,其中Ok
值是调用成功后的反序列化结果,而Err
值是API返回的强类型错误。这个内部错误表明请求存在问题,如文件不存在、权限不足等。
这样分割错误的原因是,前一类问题通常只能通过重试请求来解决,而后一类问题表明请求本身存在问题,可能不应该重试。由于大多数调用者无法以任何合理的方式处理I/O错误,这允许它们使用?
语法将其传递到堆栈中,同时仍然处理服务器返回的错误。
测试
测试也是从规范自动生成的,但与主代码不同,它们不会被检查。运行python generate.py
来生成测试,并运行cargo test
来执行它们。
测试生成器首先生成一个参考Python SDK并加载该代码。然后它生成SDK中每种类型的实例,并使用Python代码将它们序列化为JSON。然后它发出包含JSON字符串的Rust测试,将其反序列化,断言所有字段包含预期的值,重新序列化它,再次反序列化,并再次断言字段。因此,我们对Rust生成器发出的序列化和反序列化逻辑有相当好的覆盖率,与Python实现(Dropbox在服务器端使用的)进行了检查。
杂项
一些实现说明、限制和待办事项
- Stone允许结构继承自其他结构并具有多态性。Rust没有这些范式,因此此SDK将多态父结构表示为枚举,并将继承的字段放入所有变体中。有关示例,请参阅
dropbox_sdk::files::Metadata
。 - 此crate仅支持同步I/O。最终我们可能希望支持异步I/O,这将需要对路由返回的类型进行不兼容的更改。这可能需要等到futures生态系统和async/await稳定一些。
- 此代码大部分不使用
serde_derive
,而是使用手动发出的序列化代码。此crate之前的工作尝试使用serde_derive
,但Dropbox API序列化包含结构的联合(通过将它们的字段折叠到联合中)的方式不受serde_derive
支持。它还花费了极长的时间编译(发布构建约为30分钟)和巨大的(约190MB).rlib文件。手写的代码更灵活,编译更快,生成的二进制文件更小,但代价是生成的源代码更大。 - 具有约束的类型(例如具有模式或最小/最大长度的字符串或具有范围的整数)不会检查存储在其中的数据是否符合约束。
快乐的Dropbox生活!
依赖项
~7–16MB
~326K SLoC