Juniper : Création d'API GraphQL efficaces en Rust

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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/await via juniper::graphql_object et async-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 :



<                    

Recommendations