Juniper: Criando APIs GraphQL eficientes em Rust

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Juniper — Biblioteca GraphQL para Rust



Juniper é uma biblioteca poderosa e de alto desempenho para criar APIs GraphQL na linguagem Rust. Ela fornece aos desenvolvedores macros e tipos convenientes para construir rapidamente esquemas, resolvers e processamento de consultas. Juniper é ideal para projetos onde velocidade, segurança de tipos e baixo consumo de memória são críticos — pontos fortes do Rust.



A biblioteca suporta resolvers síncronos e assíncronos (através de async-trait), integração com web frameworks populares (Actix-web, Rocket, Warp, Axum), além de recursos avançados: subscriptions, fragmentos, diretivas e escalares personalizados.



Principais recursos do Juniper



  • Macros para desenvolvimento rápido: #[derive(GraphQLObject)], #[derive(GraphQLInputObject)], #[graphql_interface] geram automaticamente tipos GraphQL a partir de structs Rust.
  • Segurança de tipos em tempo de compilação: todos os erros de incompatibilidade de esquema e tipos de dados são detectados na compilação, não em tempo de execução.
  • Suporte a assincronia: integração nativa com async/await através de juniper::graphql_object e async-graphql.
  • Resolvers flexíveis: possibilidade de usar contexto, bancos de dados, APIs externas e lógica de negócios complexa.
  • Subscriptions (WebSockets): implementação de notificações em tempo real usando futures.
  • Suporte a GraphQL Playground e GraphiQL: ferramentas integradas para testar consultas.


Instalação e configuração



Adicione Juniper ao seu projeto através do Cargo.toml:



[dependencies]juniper = "0.16"# Para suporte assíncrono:juniper = { version = "0.16", features = ["async-trait"] }# Para integração com Actix-web:actix-web = "4"juniper-actix = "2"


A estrutura básica do esquema consiste em três elementos: Query (consultas), Mutation (mutações) e Subscription (assinaturas). Abaixo está um exemplo de uma API simples para gerenciar uma lista de livros.



Exemplo de código: criando uma API GraphQL simples



use juniper::{graphql_object, FieldResult, GraphQLObject, RootNode};

// Modelo de dados#[derive(GraphQLObject)]struct Book { id: String, title: String, author: String, year: i32,}

// Contexto (ex.: acesso ao banco de dados)struct Context { pub books: Vec<Book>,}impl juniper::Context for Context {}

// Resolvers para Querystruct 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"}))) }}

// Resolvers para Mutationstruct 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) }}

// Criação do nó raizpub type Schema = RootNode<'static, Query, Mutation>;

// Ponto de entrada para processar a consultapub fn create_schema() -> Schema { Schema::new(Query, Mutation)}


Para iniciar o servidor com Actix-web, use o conector pronto:



<                    

Recommendations