Juniper — 适用于 Rust 的 GraphQL 库
Juniper 是一个用 Rust 语言编写的快速、安全且符合人体工程学的库,用于构建 GraphQL 服务器。它允许开发具有强类型、自动生成文档和支持异步查询的 API。Juniper 非常适合那些对性能、可靠性和类型表达力要求苛刻的项目。
与传统的 REST API 不同,GraphQL 允许客户端仅请求所需的数据,从而减少网络和服务器的负载。Juniper 实现了完整的 GraphQL 规范(包括通过 WebSocket 的订阅),使其成为现代 Rust Web 应用程序的绝佳选择。
主要功能
- 完全支持 GraphQL — 查询、变更、订阅。
- 异步性 — 开箱即用,支持 async/await(通过 futures)。
- 与流行框架集成 — Actix-web、Rocket、Warp、Tide、Axum。
- 自动生成模式 — 基于 Rust 结构体。
- 支持上下文 — 将状态(数据库、身份验证)传递给解析器。
- 可扩展性 — 自定义标量、指令、接口。
- 安全性 — 编译时强类型,防止运行时错误。
- 文档 — 自动生成 GraphQL Schema (SDL)。
安装
将 juniper 添加到您项目的 Cargo.toml 中:
[dependencies]juniper = "0.16"为了与 Web 框架集成,请添加相应的 crate。例如,对于 Actix-web:
[dependencies]juniper = "0.16"actix-web = "4"juniper_actix = "0.3"创建一个简单的 GraphQL 服务器
我们来看一个创建用于获取用户列表的 API 的示例。首先,定义数据模型和解析器。
1. 定义 GraphQL 类型
使用宏 #[derive(GraphQLObject)] 和 #[derive(GraphQLInputObject)]:
use juniper::{GraphQLObject, GraphQLInputObject};
#[derive(GraphQLObject)]#[graphql(description = "系统用户")]struct User { id: i32, name: String, email: String,}
#[derive(GraphQLInputObject)]#[graphql(description = "新用户")]struct NewUser { name: String, email: String,}2. 创建上下文和根查询
上下文通常包含对数据库或其他服务的访问:
use std::sync::Mutex;
struct Database { users: Mutex<Vec<User>>,}
impl Database { fn new() -> Self { Database { users: Mutex::new(vec![ User { id: 1, name: "Alice".into(), email: "alice@example.com".into() }, User { id: 2, name: "Bob".into(), email: "bob@example.com".into() }, ]), } }}
// 解析器的上下文pub struct Context { pub db: Database,}
// 为 Juniper 实现 Context traitimpl juniper::Context for Context {}3. 定义根查询 (Query) 和变更 (Mutation)
pub struct QueryRoot;
#[juniper::graphql_object(Context = Context)]impl QueryRoot { fn users(context: &Context) -> Vec<User> { let db = context.db.users.lock().unwrap(); db.clone() }
fn user(context: &Context, id: i32) -> Option<User> { let db = context.db.users.lock().unwrap(); db.iter().find(|u| u.id == id).cloned() }}
pub struct MutationRoot;
#[juniper::graphql_object(Context = Context)]impl MutationRoot { fn create_user(context: &Context, new_user: NewUser) -> U