Juniper:在 Rust 中创建高效的 GraphQL API

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 启动服务器,请使用现成的连接器:



<                    

推荐