Juniper: आधुनिक वेब अनुप्रयोगों के लिए Rust पर एक सुरुचिपूर्ण GraphQL लाइब्रेरी

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Juniper — टाइप सुरक्षा और प्रदर्शन के साथ Rust पर GraphQL

\n\n

आधुनिक वेब API की दुनिया में GraphQL लचीले और कुशल इंटरफेस बनाने के लिए एक मानक बन गया है। यदि आप Rust में विकास कर रहे हैं और GraphQL को लागू करने के लिए एक परिपक्व, सुरक्षित और तेज़ लाइब्रेरी की तलाश में हैं, तो Juniper वही है जिसकी आपको आवश्यकता है। Juniper एक घोषणात्मक मैक्रो-आधारित दृष्टिकोण, Rust प्रकारों का पूर्ण समर्थन और लोकप्रिय वेब फ्रेमवर्क के साथ सहज एकीकरण प्रदान करता है।

\n\n

Juniper आपको Rust संरचनाओं और एनम के माध्यम से सीधे GraphQL स्कीमा का वर्णन करने की अनुमति देता है, जो सभी चरणों में टाइप-सुरक्षा (type-safety) की गारंटी देता है। लाइब्रेरी सब्सक्रिप्शन, म्यूटेशन, जटिल प्रकार, इंटरफेस, यूनियन-प्रकार और कस्टम स्केलर का समर्थन करती है। Rust के शून्य-लागत अमूर्तन के कारण, Juniper न्यूनतम ओवरहेड के साथ काम करता है।

\n\n

Juniper की मुख्य विशेषताएं

\n
    \n
  • स्कीमा का घोषणात्मक विवरण — मैक्रोज़ #[derive(GraphQLObject)], #[derive(GraphQLInputObject)] और #[derive(GraphQLEnum)] का उपयोग करें।
  • \n
  • एसिंक्रोनस समर्थन — async/await और किसी भी एसिंक्रोनस रनटाइम (Tokio, async-std) के साथ काम करता है।
  • \n
  • अंतर्निहित संदर्भ — Context के माध्यम से स्थिति (डेटाबेस, प्रमाणीकरण) पास करें।
  • \n
  • सब्सक्रिप्शन — WebSocket के माध्यम से रीयल-टाइम अपडेट का कार्यान्वयन।
  • \n
  • फ्रेमवर्क के साथ एकीकरण — actix-web, rocket, warp, axum और iron के लिए आधिकारिक क्रेट्स।
  • \n
  • सत्यापन और त्रुटियां — FieldError के माध्यम से स्वचालित प्रकार जांच और कस्टम त्रुटियां।
  • \n
\n\n

Juniper और Actix-web के साथ त्वरित शुरुआत

\n

Actix-web पर एक न्यूनतम GraphQL सर्वर उदाहरण देखें। आरंभ करने के लिए Cargo.toml में निर्भरताएं जोड़ें:

\n\n
[dependencies]\njuniper = "0.16"\nactix-web = "4"\nactix-rt = "2"\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"
\n\n

अब एक सरल स्कीमा बनाएं जिसमें एक मूल क्वेरी हो:

\n\n
use juniper::{GraphQLObject, GraphQLInputObject, FieldResult, Context, RootNode};\n\n// प्रतिक्रिया के लिए ऑब्जेक्ट परिभाषित करें\n#[derive(GraphQLObject)]\nstruct User {\n    id: i32,\n    name: String,\n    email: String,\n}\n\n// म्यूटेशन के लिए इनपुट ऑब्जेक्ट\n#[derive(GraphQLInputObject)]\nstruct CreateUserInput {\n    name: String,\n    email: String,\n}\n\n// संदर्भ — डेटा भंडारण (उदाहरण के लिए, इन-मेमोरी)\npub struct Database {\n    users: Vec<User>,\n}\n\nimpl Context for Database {}\n\n// मूल क्वेरीज़ (Query)\npub struct Query;\n\n#[juniper::graphql_object(context = Database)]\nimpl Query {\n    fn users(context: &Database) -> Vec<User> {\n        context.users.clone()\n    }\n\n    fn user(context: &Database, id: i32) -> Option<User> {\n        context.users.iter().find(|u| u.id == id).cloned()\n    }\n}\n\n// मूल म्यूटेशन (Mutation)\npub struct Mutation;\n\n#[juniper::graphql_object(context = Database)]\nimpl Mutation {\n    fn create_user(context: &mut Database, input: CreateUserInput) -> FieldResult<User> {\n        let new_id = context.users.len() as i32 + 1;\n        let user = User {\n            id: new_id,\n            name: input.name,\n            email: input.email,\n        };\n        context.users.push(user.clone());\n        Ok(user)\n    }\n}\n\n// स्कीमा को एकत्रित करें\npub type Schema = RootNode<'static, Query, Mutation>;
\n\n

Actix-web के साथ एकीकरण

\n

अब Juniper को Actix-web के HTTP एंडपॉइंट से जोड़ें:

\n\n
use actix_web::{web, App, HttpServer, HttpResponse, middleware};\nuse juniper_actix::{graphql_handler, playground_handler};\nuse std::sync::Mutex;\                    

अनुशंसाएँ