Juniper — 用于 Rust 的 GraphQL 库
Juniper 是一个强大且高性能的库,用于在 Rust 语言中创建 GraphQL API。它为开发者提供了便捷的宏和类型,用于快速构建模式、解析器和处理请求。Juniper 非常适合那些对运行速度、类型安全性和低内存消耗(Rust 的优势)有严格要求的项目。
该库支持同步和异步解析器(通过 async-trait),可与流行的 Web 框架(Actix-web、Rocket、Warp、Axum)集成,并提供高级功能:订阅(Subscriptions)、片段、指令和自定义标量。
Juniper 的主要功能
- 用于快速开发的宏:
#[derive(GraphQLObject)]、#[derive(GraphQLInputObject)]、#[graphql_interface]可从 Rust 结构体自动生成 GraphQL 类型。 - 编译时类型安全: 所有模式与数据类型不匹配的错误都在构建阶段捕获,而非运行时。
- 异步支持: 通过
juniper::graphql_object和async-graphql内置集成async/await。 - 灵活的解析器: 可使用上下文、数据库、外部 API 和复杂的业务逻辑。
- 订阅(WebSockets): 使用
futures实现实时通知。 - 支持 GraphQL Playground 和 GraphiQL: 内置用于测试查询的工具。
安装与配置
通过 Cargo.toml 将 Juniper 添加到您的项目中:
[dependencies]juniper = "0.16"# 用于异步支持:juniper = { version = "0.16", features = ["async-trait"] }# 用于与 Actix-web 集成:actix-web = "4"juniper-actix = "2"模式的基本结构由三个元素组成:Query(查询)、Mutation(变更)和 Subscription(订阅)。以下是一个用于管理图书列表的简单 API 示例。
代码示例:创建简单的 GraphQL API
use juniper::{graphql_object, FieldResult, GraphQLObject, RootNode};
// 数据模型#[derive(GraphQLObject)]struct Book { id: String, title: String, author: String, year: i32,}
// 上下文(例如,数据库访问)struct Context { pub books: Vec<Book>,}impl juniper::Context for Context {}
// Query 的解析器struct Query;#[graphql_object]#[graphql(context = Context)]impl Query { fn books(context: &Context) -> &Vec<Book> { &context.books }
fn book_by_id(context: &Context, id: String) -> FieldResult<&Book> { context.books.iter() .find(|b| b.id == id) .ok_or_else(|| juniper::FieldError::new("Book not found", graphql_value!({"code": "NOT_FOUND"}))) }}
// Mutation 的解析器struct Mutation;#[graphql_object]#[graphql(context = Context)]impl Mutation { fn add_book(context: &mut Context, title: String, author: String, year: i32) -> FieldResult<Book> { let new_book = Book { id: uuid::Uuid::new_v4().to_string(), title, author, year, }; context.books.push(new_book); Ok(new_book) }}
// 创建根节点pub type Schema = RootNode<'static, Query, Mutation>;
// 处理请求的入口点pub fn create_schema() -> Schema { Schema::new(Query, Mutation)}要使用 Actix-web 启动服务器,请使用现成的连接器:
<