Juniper: Erstellung effizienter GraphQL-APIs in Rust

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Juniper — GraphQL-Bibliothek für Rust



Juniper ist eine leistungsstarke und effiziente Bibliothek zur Erstellung von GraphQL-APIs in der Sprache Rust. Sie bietet Entwicklern praktische Makros und Typen für den schnellen Aufbau von Schemata, Resolvern und der Abfrageverarbeitung. Juniper eignet sich ideal für Projekte, bei denen Geschwindigkeit, Typsicherheit und geringer Speicherverbrauch entscheidend sind – die Stärken von Rust.



Die Bibliothek unterstützt sowohl synchrone als auch asynchrone Resolver (über async-trait), die Integration mit gängigen Web-Frameworks (Actix-web, Rocket, Warp, Axum) sowie erweiterte Funktionen: Subscriptions, Fragmente, Direktiven und benutzerdefinierte Skalare.



Hauptfunktionen von Juniper



  • Makros für schnelle Entwicklung: #[derive(GraphQLObject)], #[derive(GraphQLInputObject)], #[graphql_interface] generieren automatisch GraphQL-Typen aus Rust-Strukturen.
  • Typsicherheit auf Kompilierungsebene: Alle Fehler durch Schema- und Datentypinkonsistenzen werden zur Build-Zeit abgefangen, nicht zur Laufzeit.
  • Asynchrone Unterstützung: Integrierte Integration mit async/await über juniper::graphql_object und async-graphql.
  • Flexible Resolver: Möglichkeit zur Nutzung von Kontext, Datenbanken, externen APIs und komplexer Geschäftslogik.
  • Subscriptions (WebSockets): Implementierung von Echtzeit-Benachrichtigungen mit futures.
  • Unterstützung für GraphQL Playground und GraphiQL: Integrierte Werkzeuge zum Testen von Abfragen.


Installation und Einrichtung



Fügen Sie Juniper zu Ihrem Projekt über Cargo.toml hinzu:



[dependencies]juniper = "0.16"# Für asynchrone Unterstützung:juniper = { version = "0.16", features = ["async-trait"] }# Für Integration mit Actix-web:actix-web = "4"juniper-actix = "2"


Die grundlegende Schema-Struktur besteht aus drei Elementen: Query (Abfragen), Mutation (Änderungen) und Subscription (Abonnements). Nachfolgend finden Sie ein Beispiel einer einfachen API zur Verwaltung einer Bücherliste.



Codebeispiel: Erstellung einer einfachen GraphQL-API



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

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

// Kontext (z. B. Datenbankzugriff)struct Context { pub books: Vec<Book>,}impl juniper::Context for Context {}

// Resolver für 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"}))) }}

// Resolver für 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) }}

// Erstellung des Root-Knotenspub type Schema = RootNode<'static, Query, Mutation>;

// Einstiegspunkt zur Verarbeitung der Abfragepub fn create_schema() -> Schema { Schema::new(Query, Mutation)}


Zum Starten des Servers mit Actix-web verwenden Sie den vorgefertigten Connector:



<                    

Empfehlungen