आपने डेवलपर्स को GraphQL के चमत्कारों की प्रशंसा करते सुना होगा। इस श्रृंखला में हम प्रौद्योगिकियों का उपयोग करके उन्हें सीखना पसंद करते हैं, और यह लेख एक उदाहरण एप्लिकेशन के माध्यम से जाएगा जो GraphQL का उपयोग करता है।
GraphQL क्या है
GraphQL एक क्वेरी भाषा और रनटाइम है जिसका उपयोग API बनाने के लिए किया जा सकता है। यह विकास स्टैक में REST API के समान स्थिति रखता है लेकिन अधिक लचीलेपन के साथ। REST के विपरीत, GraphQL क्लाइंट द्वारा रिस्पांस फॉर्मेट और कंटेंट को निर्दिष्ट करने की अनुमति देता है। जैसे SQL SELECT स्टेटमेंट्स क्वेरी परिणामों को निर्दिष्ट करने की अनुमति देते हैं, GraphQL लौटाए गए JSON डेटा संरचनाओं को निर्दिष्ट करने की अनुमति देता है। SQL सादृश्य का अनुसरण करते हुए, GraphQL WHERE क्लॉज़ प्रदान नहीं करता है लेकिन एप्लिकेशन ऑब्जेक्ट्स पर उन फ़ील्ड्स की पहचान करता है जो रिस्पांस के लिए डेटा प्रदान करना चाहिए।
GraphQL, जैसा कि नाम से पता चलता है, APIs को इस तरह मॉडल करता है जैसे कि एप्लिकेशन डेटा का एक ग्राफ है। हालांकि यह विवरण आपके एप्लिकेशन को देखने का तरीका नहीं हो सकता है, यह अधिकांश सिस्टम में उपयोग किया जाने वाला एक मॉडल है। JSON द्वारा दर्शाया जा सकने वाला डेटा एक ग्राफ है क्योंकि JSON सिर्फ एक डायरेक्टेड ग्राफ है। API के माध्यम से एक ग्राफ मॉडल प्रस्तुत करने के रूप में एप्लिकेशन के बारे में सोचने से GraphQL को समझना बहुत आसान हो जाएगा।
एप्लिकेशन में GraphQL का उपयोग करना
अब जब हमने GraphQL को सार में वर्णित किया है, आइए वास्तव में एक एप्लिकेशन बनाने के लिए नीचे उतरें जो GraphQL का उपयोग करता है, डेटा मॉडल या ग्राफ की परिभाषा के साथ शुरू करके। पिछले साल मैंने एक नया शौक अपनाया। मैं इलेक्ट्रिक अपराइट बास बजाना सीख रहा हूं साथ ही संगीत के बारे में सामान्य रूप से सीख रहा हूं, इसलिए एक संगीत-संबंधी उदाहरण डेमो ऐप के साथ आने पर दिमाग में आया।
उदाहरण में ऑब्जेक्ट प्रकार Artist और Song हैं। Artists के पास कई Song हैं और एक Song एक Artist से जुड़ा हुआ है। प्रत्येक ऑब्जेक्ट प्रकार के name जैसे एट्रिब्यूट्स हैं।
API को परिभाषित करें
GraphQL SDL (स्कीमा डेफिनिशन लैंग्वेज) का उपयोग करता है जिसे कभी-कभी GraphQL स्पेसिफिकेशन में "टाइप सिस्टम डेफिनिशन लैंग्वेज" कहा जाता है। GraphQL प्रकार, सिद्धांत रूप में, किसी भी भाषा में परिभाषित किए जा सकते हैं लेकिन सबसे आम एग्नोस्टिक भाषा SDL है तो आइए API को परिभाषित करने के लिए SDL का उपयोग करें।
type Artist { name: String! songs: [Song] origin: [String] } type Song { name: String! artist: Artist duration: Int release: String } एक Artist का एक name होता है जो एक String है। विस्मयादिबोधक चिह्न का अर्थ है कि फ़ील्ड non-null है। songs Song ऑब्जेक्ट्स की एक सरणी है, और origin जो एक String सरणी है। Song समान है लेकिन एक अजीब फ़ील्ड के साथ। release फ़ील्ड एक समय या तारीख प्रकार होना चाहिए लेकिन GraphQL के पास वह प्रकार कोर प्रकार के रूप में परिभाषित नहीं है। विभिन्न GraphQL कार्यान्वयनों के बीच पूर्ण पोर्टेबिलिटी के लिए, एक String का उपयोग किया जाता है। हम जिस GraphQL कार्यान्वयन का उपयोग करेंगे उसमें Time प्रकार जोड़ा गया है तो आइए Song परिभाषा को बदलें ताकि release फ़ील्ड एक Time प्रकार हो। लौटाया गया मान एक String होगा, लेकिन प्रकार को Time पर सेट करके हम API को अधिक सटीक रूप से दस्तावेज़ीकृत करते हैं।
release: Time अंतिम चरण यह वर्णन करना है कि एक या अधिक ऑब्जेक्ट्स कैसे प्राप्त करें। इसे रूट या, क्वेरीज़ के लिए, क्वेरी रूट के रूप में संदर्भित किया जाता है। हमारे रूट में केवल एक फ़ील्ड या विधि होगी जिसे artist कहा जाता है और इसके लिए एक कलाकार name की आवश्यकता होगी।
type Query { artist(name: String!): Artist } एप्लिकेशन लिखना
आइए देखें कि हम इसका उपयोग एप्लिकेशन में कैसे करेंगे। रूबी के लिए GraphQL सर्वर के कई कार्यान्वयन हैं। कुछ दृष्टिकोणों के लिए उपरोक्त SDL को रूबी समकक्ष में अनुवाद करने की आवश्यकता होती है। Agoo, एक HTTP सर्वर जिसे मैंने बनाया है, SDL परिभाषा का उपयोग जैसा है वैसा ही करता है और रूबी कोड प्लेन वेनिला रूबी है, इसलिए हम उसी का उपयोग करेंगे।
ध्यान दें कि रूबी क्लासेस GraphQL प्रकारों से मेल खाती हैं। रूबी क्लास नामों को GraphQL प्रकार नामों से मिलाकर, हम कोई अनावश्यक जटिलता नहीं जोड़ते हैं।
class Artist attr_reader :name attr_reader :songs attr_reader :origin def initialize(name, origin) @name = name @songs = [] @origin = origin end # केवल Song द्वारा खुद को कलाकार में जोड़ने के लिए उपयोग किया जाता है। def add_song(song) @songs << song end end class Song attr_reader :name # string attr_reader :artist # reference attr_reader :duration # integer attr_reader :release # time def initialize(name, artist, duration, release) @name = name @artist = artist @duration = duration @release = release artist.add_song(self) end endविधियाँ रूबी क्लासेस में फ़ील्ड्स से मेल खाती हैं। ध्यान दें कि विधियों में या तो कोई आर्गुमेंट नहीं होता है या args={}। यह वही है जो GraphQL APIs अपेक्षा करते हैं और हमारा कार्यान्वयन यहां सूट का पालन करता है। initialize विधियों का उपयोग उदाहरण के लिए डेटा सेटअप करने के लिए किया जाता है, जैसा कि हम शीघ्र ही देखेंगे।
क्वेरी रूट क्लास को भी परिभाषित करने की आवश्यकता है। ध्यान दें artist विधि जो SDL Query रूट प्रकार से मेल खाती है। artists के लिए एक attr_reader भी जोड़ा गया था। इसे केवल SDL डॉक्यूमेंट में Query प्रकार में उस फ़ील्ड को जोड़कर API के सामने उजागर किया जाएगा।
class Query attr_reader :artists def initialize(artists) @artists = artists end def artist(args={}) @artists[args['name']] end endGraphQL रूट (क्वेरी रूट के साथ भ्रमित नहीं होना चाहिए) क्वेरी रूट के ऊपर बैठता है। GraphQL इसे वैकल्पिक रूप से तीन फ़ील्ड्स होने के लिए परिभाषित करता है। इस मामले में रूबी क्लास query फ़ील्ड पर कार्यान्वित करती है। इनिशियलाइज़र टेस्टिंग के लिए कुछ डेटा लोड करता है, न्यूज़ीलैंड के एक इंडी बैंड के लिए जिसे मैं सुनना पसंद करता हूं।
class Schema attr_reader :query attr_reader :mutation attr_reader :subscription def initialize() # टेस्टिंग के लिए कुछ डेटा सेट करें। artist = Artist.new('Fazerdaze', ['Morningside', 'Auckland', 'New Zealand']) Song.new('Jennifer', artist, 240, Time.utc(2017, 5, 5)) Song.new('Lucky Girl', artist, 170, Time.utc(2017, 5, 5)) Song.new('Friends', artist, 194, Time.utc(2017, 5, 5)) Song.new('Reel', artist, 193, Time.utc(2015, 11, 2)) @artists = {artist.name => artist} @query = Query.new(@artists) end endअंतिम सेटअप कार्यान्वयन विशिष्ट है। यहां, सर्वर को /graphql HTTP अनुरोध पथ के लिए एक हैंडलर शामिल करने के लिए इनिशियलाइज़ किया जाता है और फिर इसे शुरू किया जाता है।
Agoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql') Agoo::Server.start()GraphQL कार्यान्वयन को फिर पहले परिभाषित SDL ($songs_sdl) के साथ कॉन्फ़िगर किया जाता है और फिर एप्लिकेशन सोता है जबकि सर्वर अनुरोधों को प्रोसेस करता है।
Agoo::GraphQL.schema(Schema.new) { Agoo::GraphQL.load($songs_sdl) } sleep इस उदाहरण के लिए कोड GitHub पर पाया जा सकता है।
API का उपयोग करना
API का परीक्षण करने के लिए, आप एक वेब ब्राउज़र, Postman या curl का उपयोग कर सकते हैं।
कोशिश करने के लिए GraphQL क्वेरी इस तरह दिखती है:
{ artist(name:"Fazerdaze") { name songs{ name duration } } } क्वेरी Fazerdaze नाम के Artist के लिए पूछती है और name और songs को एक JSON डॉक्यूमेंट में लौटाती है। प्रत्येक Song के लिए Song का name और duration एक JSON ऑब्जेक्ट में लौटाया जाता है। आउटपुट इस तरह दिखना चाहिए।
{ "data": { "artist": { "name": "Fazerdaze", "songs": [ { "name": "Jennifer", "duration": 240 }, { "name": "Lucky Girl", "duration": 170 }, { "name": "Friends", "duration": 194 }, { "name": "Reel", "duration": 193 } ] } } }क्वेरी में वैकल्पिक व्हाइटस्पेस से छुटकारा पाने के बाद, curl के साथ किया गया एक HTTP GET उस कंटेंट को लौटाना चाहिए।
curl -w "\n" 'localhost:6464/graphql?query=\{artist(name:"Fazerdaze")\{name,songs\{name,duration\}\}\}&indent=2'क्वेरी बदलने का प्रयास करें और duration को release से बदलें और रूबी Time के JSON स्ट्रिंग में रूपांतरण को नोट करें।
गीत का आउटरो
हम GraphQL के साथ खेलने का आनंद लिया और हम आशा करते हैं कि आप साथ आए और रास्ते में कुछ सीखा। धन्यवाद, आप एक महान दर्शक रहे हैं। यदि आप अधिक रूबी के बारे में बात करना चाहते हैं, तो हम बार में मर्च बेच रहे होंगे।