3个版本
0.1.0 | 2021年3月6日 |
---|---|
0.1.0-alpha.1 | 2020年4月26日 |
0.1.0-alpha.0 | 2020年4月9日 |
#268 在 HTTP客户端
用于 2 个包
94KB
1.5K SLoC
artemis
一个现代的GraphQL客户端,内置常见功能,并通过交换扩展其功能
入门
此包需要两个依赖项
你的常规依赖项中的主要包,以及 artemis-build
在你的 dev-dependencies
中。
第一步是在 .graphql
文件中编写一些查询,然后将以下内容添加到你的 build.rs
中(如有必要,请创建它)
use artemis_build::CodegenBuilder;
fn main() {
CodegenBuilder::new()
.introspect_schema("https://127.0.0.1:8080/graphql", None, Vec::new())
.unwrap()
.add_query("queries/x.graphql")
.with_out_dir("src/queries")
.build()
.unwrap();
}
之后,你可以在应用程序中使用该包,如下所示
use artemis::Client;
use artemis_test::get_conference::{GetConference, get_conference::Variables};
let client = Client::builder("https://127.0.0.1:8080/graphql")
.with_default_exchanges()
.build();
let result = client.query(GetConference, Variables { id: "1".to_string() }).await.unwrap();
assert!(result.data.is_some());
有关更多信息,请参阅相关方法和结构体文档。
构建
此包使用代码生成,将你的GraphQL文件转换为强类型Rust模块。这些模块包含查询结构体,如零大小的类型GetConference
,以及包含Variables
、任何输入类型、ResponseData
类型和任何相关输出类型的子模块。
具有强类型编译时表示以及额外信息(例如,所有相关类型的__typename
和抽象选择树)意味着CPU在运行时所需的工作非常少,仅涉及序列化、反序列化和使用静态生成数据的简单查找。
有关如何使用查询构建器的详细信息,请参阅 artemis-build
交换
交换类似于双向中间件。它们作用于传入和传出的查询,如果无法返回结果,则将它们传递下去。
有三个默认交换,按以下顺序调用
去重交换
去重交换(DedupExchange
)通过将多个相同的查询合并为一个来过滤掉不必要的查询。它是通过跟踪正在进行的查询来完成的,而不是触发另一个相同的查询,而是等待其结果。这减少了网络流量,尤其是在较大的应用程序中,同一查询可能在多个地方使用,并且可能同时多次运行。
缓存交换
缓存交换是一个非常基本的未归一化缓存,它会积极使查询失效。它关注简洁性和数据正确性,因此如果一个查询使用了与突变相同的任何类型,它将始终被它使失效。这意味着,尤其是如果你有大量相同类型的不同实体,这可能会迅速变得昂贵。对于一种更高级的归一化缓存,它只使直接相关实体失效,请参阅 artemis-normalized-cache
包。
FetchExchange
fetch交换会将查询序列化,通过网络发送,并反序列化响应。这在x86上使用reqwest
,如果你使用WASM,则使用fetch
。这应该是链中的最后一个交换,因为它从不转发查询。
WASM
WASM支持需要在你的代码中做一些小的样板代码。首先,在你的查询中有一个wasm
模块,它包含一个自动生成的枚举,包含所有你的查询。这用于在WASM边界传输类型数据。
其次,你必须使用wasm_client! 宏来生成一个WASM互操作客户端,该客户端为你的查询具有硬编码的类型,再次消除不受支持的泛型和在边界传输类型数据。传递给宏的查询类型必须是上述提到的枚举生成的。
JavaScript类型和方法的文档可以在构建WASM时输出的TypeScript定义中找到。
功能
default-exchanges
(默认) - 包含默认交换和相关构建方法observable
(默认) - 包含对可观察的以及所有相关类型的支持。包括x86上的tokio
。
依赖项
~4–10MB
~209K SLoC