जुनिपर — रस्ट के लिए GraphQL लाइब्रेरी
जुनिपर रस्ट भाषा में GraphQL सर्वर बनाने के लिए एक तेज़, सुरक्षित और एर्गोनोमिक लाइब्रेरी है। यह सख्त टाइपिंग, स्वचालित दस्तावेज़ीकरण जनरेशन और एसिंक्रोनस अनुरोधों के समर्थन के साथ API विकसित करने की अनुमति देता है। जुनिपर उन परियोजनाओं के लिए आदर्श है जहां प्रदर्शन, विश्वसनीयता और प्रकारों की अभिव्यक्ति महत्वपूर्ण हैं।
पारंपरिक REST API के विपरीत, GraphQL क्लाइंट को केवल आवश्यक डेटा का अनुरोध करने की अनुमति देता है, जिससे नेटवर्क और सर्वर पर लोड कम होता है। जुनिपर GraphQL के पूर्ण विनिर्देशन (WebSocket के माध्यम से सब्सक्रिप्शन सहित) को लागू करता है, जो इसे रस्ट पर आधुनिक वेब अनुप्रयोगों के लिए एक उत्कृष्ट विकल्प बनाता है।
मुख्य विशेषताएं
- GraphQL का पूर्ण समर्थन — क्वेरी, म्यूटेशन, सब्सक्रिप्शन।
- एसिंक्रोनस — बॉक्स से बाहर async/await (futures के माध्यम से) के साथ काम करता है।
- लोकप्रिय फ्रेमवर्क के साथ एकीकरण — Actix-web, Rocket, Warp, Tide, Axum।
- स्वचालित स्कीमा जनरेशन — रस्ट संरचनाओं पर आधारित।
- संदर्भ समर्थन — रिज़ॉल्वर में स्थिति (DB, प्रमाणीकरण) स्थानांतरित करना।
- विस्तारशीलता — कस्टम स्केलर, निर्देश, इंटरफ़ेस।
- सुरक्षा — संकलन स्तर पर सख्त टाइपिंग, रनटाइम त्रुटियों को रोकता है।
- दस्तावेज़ीकरण — GraphQL स्कीमा (SDL) का स्वचालित जनरेशन।
स्थापना
अपने प्रोजेक्ट के Cargo.toml में juniper जोड़ें:
[dependencies]juniper = "0.16"वेब फ्रेमवर्क के साथ एकीकरण के लिए, संबंधित क्रेट जोड़ें। उदाहरण के लिए, Actix-web के लिए:
[dependencies]juniper = "0.16"actix-web = "4"juniper_actix = "0.3"एक सरल GraphQL सर्वर बनाना
उपयोगकर्ताओं की सूची प्राप्त करने के लिए API बनाने का एक उदाहरण देखें। पहले डेटा मॉडल और रिज़ॉल्वर को परिभाषित करें।
1. GraphQL प्रकारों की परिभाषा
मैक्रोज़ #[derive(GraphQLObject)] और #[derive(GraphQLInputObject)] का उपयोग करें:
use juniper::{GraphQLObject, GraphQLInputObject};
#[derive(GraphQLObject)]#[graphql(description = "सिस्टम उपयोगकर्ता")]struct User { id: i32, name: String, email: String,}
#[derive(GraphQLInputObject)]#[graphql(description = "नया उपयोगकर्ता")]struct NewUser { name: String, email: String,}2. संदर्भ और रूट क्वेरी बनाना
संदर्भ में आमतौर पर डेटाबेस या अन्य सेवाओं तक पहुंच होती है:
use std::sync::Mutex;
struct Database { users: Mutex<Vec<User>>,}
impl Database { fn new() -> Self { Database { users: Mutex::new(vec![ User { id: 1, name: "Alice".into(), email: "alice@example.com".into() }, User { id: 2, name: "Bob".into(), email: "bob@example.com".into() }, ]), } }}
// रिज़ॉल्वर के लिए संदर्भpub struct Context { pub db: Database,}
// जुनिपर के लिए Context ट्रेट का कार्यान्वयनimpl juniper::Context for Context {}3. रूट क्वेरी (Query) और म्यूटेशन (Mutation) की परिभाषा
pub struct QueryRoot;
#[juniper::graphql_object(Context = Context)]impl QueryRoot { fn users(context: &Context) -> Vec<User> { let db = context.db.users.lock().unwrap(); db.clone() }
fn user(context: &Context, id: i32) -> Option<User> { let db = context.db.users.lock().unwrap(); db.iter().find(|u| u.id == id).cloned() }}
pub struct MutationRoot;
#[juniper::graphql_object(Context = Context)]impl MutationRoot { fn create_user(context: &Context, new_user: NewUser) -> U