9 个版本 (稳定版)
1.0.7 | 2022年10月28日 |
---|---|
1.0.6 | 2022年6月26日 |
1.0.4 | 2022年3月11日 |
1.0.2 | 2022年1月30日 |
0.1.1 | 2020年12月3日 |
#3 in #graphql-client
2,467 个月下载量
在 6 crates 中使用
19KB
332 行
gql_client
最小化 GraphQL 客户端,适用于 Rust
- 简单 API,支持查询和突变
- 不需要模式文件进行内省
- 支持 WebAssembly
基本用法
- 使用 client.query_with_vars 对带有变量的查询进行操作
- 如果没有传递变量的需要,也有一个包装的 client.query
use gql_client::Client;
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
pub struct Data {
user: User
}
#[derive(Deserialize)]
pub struct User {
id: String,
name: String
}
#[derive(Serialize)]
pub struct Vars {
id: u32
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let endpoint = "https://graphqlzero.almansi.me/api";
let query = r#"
query UserByIdQuery($id: ID!) {
user(id: $id) {
id
name
}
}
"#;
let client = Client::new(endpoint);
let vars = Vars { id: 1 };
let data = client.query_with_vars::<Data, Vars>(query, vars).await.unwrap();
println!("Id: {}, Name: {}", data.user.id, data.user.name);
Ok(())
}
传递 HTTP 头
客户端公开了 new_with_headers 函数,用于使用简单的 HashMap<&str, &str> 传递头信息
use gql_client::Client;
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let endpoint = "https://graphqlzero.almansi.me/api";
let mut headers = HashMap::new();
headers.insert("authorization", "Bearer <some_token>");
let client = Client::new_with_headers(endpoint, headers);
Ok(())
}
错误处理
可能出现的两种错误类型:HTTP 相关错误(例如,认证问题)或 JSON 响应中的 GraphQL 查询错误。通过正确实现 GraphQLError 结构体的 Debug 和 Display,可以正确显示这些错误信息。此外,您还可以通过调用 err.json() 来查看 JSON 内容,以获取更详细的信息输出
use gql_client::Client;
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
pub struct Data {
user: User
}
#[derive(Deserialize)]
pub struct User {
id: String,
name: String
}
#[derive(Serialize)]
pub struct Vars {
id: u32
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let endpoint = "https://graphqlzero.almansi.me/api";
// Send incorrect request
let query = r#"
query UserByIdQuery($id: ID!) {
user(id: $id) {
id1
name
}
}
"#;
let client = Client::new(endpoint);
let vars = Vars { id: 1 };
let error = client.query_with_vars::<Data, Vars>(query, vars).await.err();
println!("{:?}", error);
Ok(())
}
依赖项
~4–17MB
~243K SLoC