जुनिपर — Rust के लिए GraphQL लाइब्रेरी
जुनिपर Rust भाषा में GraphQL API बनाने के लिए एक शक्तिशाली और उच्च-प्रदर्शन वाली लाइब्रेरी है। यह डेवलपर्स को स्कीमा, रिज़ॉल्वर और क्वेरी प्रोसेसिंग के तेज़ निर्माण के लिए सुविधाजनक मैक्रोज़ और प्रकार प्रदान करती है। Juniper उन परियोजनाओं के लिए आदर्श है जहाँ गति, प्रकार सुरक्षा और कम मेमोरी खपत महत्वपूर्ण है — ये Rust की मजबूत विशेषताएँ हैं।
लाइब्रेरी सिंक्रोनस और एसिंक्रोनस दोनों रिज़ॉल्वर (async-trait के माध्यम से), लोकप्रिय वेब फ्रेमवर्क (Actix-web, Rocket, Warp, Axum) के साथ एकीकरण, और उन्नत सुविधाओं: सब्सक्रिप्शन, फ़्रैगमेंट, डायरेक्टिव और कस्टम स्केलर का समर्थन करती है।
जुनिपर की मुख्य विशेषताएँ
- त्वरित विकास के लिए मैक्रोज़:
#[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,}
// संदर्भ (उदाहरण के लिए, DB तक पहुँच)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 पर सर्वर चलाने के लिए तैयार कनेक्टर का उपयोग करें:
<
पुस्तकालय में भी
Spring WebFlux Java: पूर्ण गाइड रिएक्टिव प्रोग्रामिंग के साथ
Rust में Rate Limiting: अनुरोध आवृत्ति सीमित करने वाली लाइब्रेरीज़
Go में छवियों के साथ काम करना: imaging लाइब्रेरी के साथ resize और crop