Juniper — Bibliothèque GraphQL pour Rust
Juniper est une bibliothèque puissante et performante pour créer des API GraphQL en langage Rust. Elle offre aux développeurs des macros et des types pratiques pour construire rapidement des schémas, des résolveurs et traiter les requêtes. Juniper est idéal pour les projets où la vitesse, la sécurité des types et une faible consommation mémoire sont critiques — les points forts de Rust.
La bibliothèque prend en charge à la fois les résolveurs synchrones et asynchrones (via async-trait), l'intégration avec les frameworks web populaires (Actix-web, Rocket, Warp, Axum), ainsi que des fonctionnalités avancées : les abonnements (Subscriptions), les fragments, les directives et les scalaires personnalisés.
Fonctionnalités principales de Juniper
- Macros pour un développement rapide :
#[derive(GraphQLObject)],#[derive(GraphQLInputObject)],#[graphql_interface]génèrent automatiquement des types GraphQL à partir de structures Rust. - Sécurité des types au niveau de la compilation : toutes les erreurs d'inadéquation entre le schéma et les types de données sont détectées lors de la construction, et non à l'exécution.
- Prise en charge de l'asynchrone : intégration native avec
async/awaitviajuniper::graphql_objectetasync-graphql. - Résolveurs flexibles : possibilité d'utiliser le contexte, les bases de données, les API externes et une logique métier complexe.
- Abonnements (WebSockets) : implémentation de notifications en temps réel utilisant
futures. - Prise en charge de GraphQL Playground et GraphiQL : outils intégrés pour tester les requêtes.
Installation et configuration
Ajoutez Juniper à votre projet via Cargo.toml :
[dependencies]juniper = "0.16"# Pour la prise en charge asynchrone :juniper = { version = "0.16", features = ["async-trait"] }# Pour l'intégration avec Actix-web :actix-web = "4"juniper-actix = "2"La structure de base d'un schéma se compose de trois éléments : Query (requêtes), Mutation (modifications) et Subscription (abonnements). Voici un exemple d'API simple pour gérer une liste de livres.
Exemple de code : création d'une API GraphQL simple
use juniper::{graphql_object, FieldResult, GraphQLObject, RootNode};
// Modèle de données#[derive(GraphQLObject)]struct Book { id: String, title: String, author: String, year: i32,}
// Contexte (par exemple, accès à la base de données)struct Context { pub books: Vec<Book>,}impl juniper::Context for Context {}
// Résolveurs pour 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"}))) }}
// Résolveurs pour 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) }}
// Création du nœud racinepub type Schema = RootNode<'static, Query, Mutation>;
// Point d'entrée pour traiter la requêtepub fn create_schema() -> Schema { Schema::new(Query, Mutation)}Pour lancer le serveur avec Actix-web, utilisez le connecteur prêt à l'emploi :
<
Aussi dans la bibliothèque
ASP.NET Core pour C# (.NET) : guide complet avec exemples
Files d'attente de tâches pour Rust : Aperçu des bibliothèques et outils populaires
Générateur de codes QR en Kotlin : création et personnalisation de codes QR
nock pour TypeScript : guide complet avec exemples