88个稳定版本

7.0.7 2024年7月14日
7.0.5 2024年5月9日
7.0.3 2024年3月16日
6.0.11 2023年11月19日
2.11.3 2021年11月13日

#2181 in 异步

Download history 51/week @ 2024-04-14 71/week @ 2024-04-21 61/week @ 2024-04-28 145/week @ 2024-05-05 159/week @ 2024-05-12 67/week @ 2024-05-19 28/week @ 2024-05-26 212/week @ 2024-06-02 108/week @ 2024-06-09 103/week @ 2024-06-16 45/week @ 2024-06-23 101/week @ 2024-06-30 146/week @ 2024-07-07 441/week @ 2024-07-14 567/week @ 2024-07-21 943/week @ 2024-07-28

每月2,101次下载

MIT/Apache

1MB
27K SLoC

async-graphql

一个高性能、完全符合规范的GraphQL服务器库

书籍中文文档文档GitHub仓库Cargo包


ci status code coverage Unsafe Rust forbidden Crates.io version docs.rs docs downloads PRs Welcome

此crate使用#![forbid(unsafe_code)]来确保所有内容都是100%安全的Rust实现。

静态模式

use std::error::Error;

use async_graphql::{http::GraphiQLSource, EmptyMutation, EmptySubscription, Object, Schema};
use async_graphql_poem::*;
use poem::{listener::TcpListener, web::Html, *};

struct Query;

#[Object]
impl Query {
    async fn howdy(&self) -> &'static str {
        "partner"
    }
}

#[handler]
async fn graphiql() -> impl IntoResponse {
    Html(GraphiQLSource::build().finish())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // create the schema
    let schema = Schema::build(Query, EmptyMutation, EmptySubscription).finish();

    // start the http server
    let app = Route::new().at("/", get(graphiql).post(GraphQL::new(schema)));
    println!("GraphiQL: https://127.0.0.1:8000");
    Server::new(TcpListener::bind("0.0.0.0:8000"))
        .run(app)
        .await?;
    Ok(())
}

动态模式

需要启用dynamic-schema功能。

use std::error::Error;

use async_graphql::{dynamic::*, http::GraphiQLSource};
use async_graphql_poem::*;
use poem::{listener::TcpListener, web::Html, *};

#[handler]
async fn graphiql() -> impl IntoResponse {
    Html(GraphiQLSource::build().finish())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let query = Object::new("Query").field(Field::new(
        "howdy",
        TypeRef::named_nn(TypeRef::STRING),
        |_| FieldFuture::new(async { "partner" }),
    ));

    // create the schema
    let schema = Schema::build(query, None, None).register(query).finish()?;

    // start the http server
    let app = Route::new().at("/", get(graphiql).post(GraphQL::new(schema)));
    println!("GraphiQL: https://127.0.0.1:8000");
    Server::new(TcpListener::bind("0.0.0.0:8000"))
        .run(app)
        .await?;
    Ok(())
}

功能

  • 完全支持静态和动态模式
  • 完全支持async/await
  • 类型安全
  • Rustfmt友好(过程宏)
  • 自定义标量
  • 最小开销
  • 易于集成(《poem》、《axum》、《actix-web》、《tide》、《warp》、《rocket》...)
  • 上传文件(多部分请求)
  • 订阅(WebSocket传输)
  • 自定义扩展
  • 错误扩展
  • 限制查询复杂度/深度
  • 批量查询
  • Apollo持久查询
  • Apollo跟踪扩展
  • Apollo联邦(v2)

注意:最低支持的Rust版本:1.75.0或更高

示例

所有示例都在子仓库中,位于examples目录。

git submodule update # update the examples repo
cd examples && cargo run --bin [name]

更多信息,请参阅子存储库的README.md。

集成

集成是将async-graphql与您的Web服务器粘合在一起的部分,这里提供了以下集成,或者您可以构建自己的集成!

crate特性

本crate提供以下特性。大多数特性默认未启用,除了GraphiQL (graphiql)和GraphQL Playground (playground)的集成。

feature 启用
apollo_tracing 启用Apollo tracing扩展
apollo_persisted_queries 启用Apollo持久化查询扩展
log 启用Logger扩展
tracing 启用Tracing扩展
opentelemetry 启用OpenTelemetry扩展
unblock 支持Upload的异步读取器
bson bson crate集成。
chrono chrono crate集成。
chrono-tz chrono-tz crate集成。
url url crate集成。
uuid uuid crate集成。
string_number 启用StringNumber
dataloader 支持DataLoader
secrecy secrecy crate集成。
decimal rust_decimal crate集成。
bigdecimal bigdecimal crate集成。
cbor 支持serde_cbor
smol_str smol_str crate集成。
hashbrown hashbrown crate集成。
time time crate集成。
tokio-sync tokio::sync::RwLocktokio::sync::Mutex集成。
fast_chemail fast_chemail crate集成。
tempfile 将上传内容保存在临时文件中。
dynamic-schema 支持动态模式
GraphiQL 启用GraphiQL IDE集成
游乐场 启用GraphQL playground IDE集成

可观察性

Apollo Studio是用于在生产中监控您的graphql服务器的工具之一。Apollo Studio是一个云平台,帮助您构建、监控、验证和确保您组织的数据图。通过添加扩展crate async_graphql_apollo_studio_extension 来实现这一点。

谁在生产中使用了async-graphql

社区展示

博客文章

参考文献

许可证

根据以下任一许可证授权


lib.rs:

Async-graphql与Rocket集成。

注意:此集成与未发布的Rocket 0.5版本,因此可以预期此库和Rocket都将有破坏性变更。

要配置发送和接收多部分请求的选项,请将您的MultipartOptions实例添加到Rocket管理的状态中(.manage(your_multipart_options))。

完整示例

依赖关系

~20–52MB
~890K SLoC