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

Download history 915/week @ 2024-03-13 576/week @ 2024-03-20 730/week @ 2024-03-27 482/week @ 2024-04-03 681/week @ 2024-04-10 437/week @ 2024-04-17 477/week @ 2024-04-24 533/week @ 2024-05-01 512/week @ 2024-05-08 435/week @ 2024-05-15 427/week @ 2024-05-22 433/week @ 2024-05-29 539/week @ 2024-06-05 485/week @ 2024-06-12 650/week @ 2024-06-19 726/week @ 2024-06-26

2,467 个月下载量
6 crates 中使用

MIT 许可证

19KB
332

gql_client

最小化 GraphQL 客户端,适用于 Rust

Build Status crates.io docs

  • 简单 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