25 个版本

0.5.0-a.2 2024 年 8 月 20 日
0.5.0-a.12024 年 3 月 19 日
0.4.0 2024 年 3 月 12 日
0.3.4 2023 年 2 月 16 日
0.0.0 2022 年 3 月 24 日

215HTTP 客户端

Download history 4/week @ 2024-05-23 36/week @ 2024-05-30 9/week @ 2024-06-06 1/week @ 2024-06-13 2/week @ 2024-06-20 1/week @ 2024-06-27 34/week @ 2024-07-04 75/week @ 2024-07-25 16/week @ 2024-08-01 64/week @ 2024-08-15

155 每月下载量
chrs 中使用

MIT 许可证

100KB
2.5K SLoC

ChRIS Rust 客户端库

crates.io version codecov

基于 reqwest 构建 ChRIS 的客户端库。

https://docs.rs/chris/latest/chris/


lib.rs:

基于 reqwest 构建 ChRIS 的客户端库。

简介

ChRIS 是一个科学和医疗计算平台。在 ChRIS 中,称为 ChRIS 插件 的对象代表数据处理软件。用户可以通过创建 插件实例 来运行 插件。将 插件实例 链组织为 数据流

大多数 ChRIS API,也称为 CUBE,需要用户帐户。API 端点的一小部分可以匿名以只读模式访问。例如,任何人都可以列出 CUBE 的插件。但是,创建 插件实例 和浏览非公开 数据流 需要用户帐户。

提示:阅读集成测试代码以获取代码示例。

身份验证

通常,您从 CUBE URL、用户名和密码开始。首先,使用 Account::get_token 获取令牌,然后调用 ChrisClient::build

对于匿名访问,只需调用 AnonChrisClient::build

访问模式

所有客户端结构体都是泛型于[访问权],可以是[读写访问权]或[只读访问权]。在许多情况下,只有在对象类型为[读写访问权]时,方法才可用。例如,PluginRw::create_instance定义在类型Plugin<RwAccess>上,但对于Plugin<RoAccess>则不存在此类方法。

在[读写访问权]或[只读访问权]都适用的情况下,实现您的函数以泛型于[访问权]。例如,

use chris::{Access, BaseChrisClient, Plugin};

async fn generic_example<A: Access, C: BaseChrisClient<A>>(chris: &C) -> Plugin<A> {
    todo!()
}

与[只读访问权]泛型的类型通常具有与[读写访问权]泛型相同类型的方法子集。如果[只读访问权]对您来说足够好,请考虑使用[EitherClient]

use chris::{BaseChrisClient, EitherClient, PluginRo};

async fn either_client_example(chris: &EitherClient) -> PluginRo {
    chris.plugin().name("pl-dircopy").search().get_only().await.unwrap()
}

通过调用AuthedChrisClient::into_roEitherClient::into_rosearch::Search::into_rosearch::QueryBuilder::into_roLinkedModel::from,可以将对象从T<Access>转换为T<RoAccess>

搜索集合

ChRIS API围绕对象和集合的概念设计。例如,插件集合API是api/v1/plugins/,而特定的插件可以从api/v1/plugins/1/api/v1/plugins/2/等检索。集合通常也具有搜索API,例如api/v1/plugins/search/?name=pl-example

许多函数返回一个search::Search。例如,假设您想要一个[Plugin]。您需要像这样搜索它

use chris::{Access. BaseChrisClient, Plugin};

async fn get_plugin_example<A: Access, C: BaseChrisClient<A>>(chris: &C) -> Plugin<A> {
    chris
        .plugin()
        .name("pl-example")
        .search()
        .get_first()
        .await
        .unwrap()
        .expect("plugin not found")
}

您可以使用search::Search::get_first来获取Option<T>,或者使用[search::Search::get_only()]来获取仅有的T

响应数据,链接结构与未链接结构

直接表示JSON API响应数据的结构体定义在 src/models/data.rs 中,遵循命名规范 *Response,例如 [PluginResponse]。这些响应数据结构体,与 [Access] 和 [request::Client] 结合,是 [LinkedModel] 的泛型参数。为特定的泛型类型组合定义了特定方法。例如,当有读写访问权限时,你可以获取订阅源的笔记。因此,为 [LinkedModel<FeedResponse, RwAccess>] 定义了 FeedRw::note 方法。

在某些情况下,API响应数据只包含指向对象的链接(例如 "https://example.org/api/v1/5/" 而不是完整的对象(例如 {"id": 5, "name": "Example feed", "url": "https://example.org/api/v1/5/", ...})。创建完整的 [LinkedModel] 可能会非常昂贵。因此,返回一个 [LazyLinkedModel],它的工作方式与 [LinkedModel] 相同,但缺少实际的对象数据。可以通过调用 LazyLinkedModel::get 来获取对象数据。

依赖项

~13–29MB
~487K SLoC