आपने डेवलपर्स को ग्राफक्यूएल के चमत्कारों की प्रशंसा करते हुए सुना होगा। इस श्रृंखला में हम तकनीकों का उपयोग करके सीखना पसंद करते हैं, और यह लेख एक उदाहरण एप्लिकेशन के माध्यम से जाएगा जो ग्राफ़क्यूएल का उपयोग करता है।
ग्राफक्यूएल क्या है
ग्राफक्यूएल एक क्वेरी भाषा और रनटाइम है जिसका उपयोग एपीआई बनाने के लिए किया जा सकता है। यह विकास स्टैक में REST API के समान स्थिति रखता है लेकिन अधिक लचीलेपन के साथ। REST के विपरीत, GraphQL क्लाइंट द्वारा प्रतिक्रिया स्वरूपों और सामग्री को निर्दिष्ट करने की अनुमति देता है। जैसे SQL SELECT
कथन क्वेरी परिणामों को निर्दिष्ट करने की अनुमति देते हैं, GraphQL लौटाए गए JSON डेटा संरचनाओं को निर्दिष्ट करने की अनुमति देता है। SQL सादृश्य के बाद, GraphQL एक WHERE
प्रदान नहीं करता है खंड लेकिन अनुप्रयोग वस्तुओं पर फ़ील्ड की पहचान करता है जो प्रतिक्रिया के लिए डेटा प्रदान करना चाहिए।
ग्राफक्यूएल, जैसा कि नाम से पता चलता है, मॉडल एपीआई जैसे कि एप्लिकेशन डेटा का एक ग्राफ है। हालांकि यह विवरण यह नहीं हो सकता है कि आप अपने आवेदन को कैसे देखते हैं, यह अधिकांश प्रणालियों में उपयोग किया जाने वाला मॉडल है। डेटा जिसे JSON द्वारा दर्शाया जा सकता है वह एक ग्राफ़ है क्योंकि JSON केवल एक निर्देशित ग्राफ़ है। एपीआई के माध्यम से एक ग्राफ मॉडल प्रस्तुत करने के रूप में आवेदन के बारे में सोचने से ग्राफक्यूएल को समझना बहुत आसान हो जाएगा।
आवेदन में GraphQL का उपयोग करना
अब जब हमने सार में ग्राफक्यूएल का वर्णन किया है, तो आइए वास्तव में एक ऐसे एप्लिकेशन का निर्माण करें जो डेटा मॉडल या ग्राफ की परिभाषा के साथ शुरू करके ग्राफक्यूएल का उपयोग करता है। पिछले साल मैंने एक नया शौक उठाया। मैं इलेक्ट्रिक अपराइट बास बजाना सीख रहा हूं और साथ ही सामान्य रूप से संगीत सीख रहा हूं, इसलिए एक डेमो ऐप के साथ आते समय संगीत से संबंधित एक उदाहरण दिमाग में आया।
उदाहरण में ऑब्जेक्ट प्रकार हैं कलाकार और गीत . कलाकार एकाधिक गीत हैं और एक गीत एक कलाकार . से संबद्ध है . प्रत्येक ऑब्जेक्ट प्रकार में विशेषताएँ होती हैं जैसे कि name
।
एपीआई परिभाषित करें
ग्राफक्यूएल एसडीएल (स्कीमा डेफिनिशन लैंग्वेज) का उपयोग करता है जिसे कभी-कभी ग्राफक्यूएल विनिर्देश में "टाइप सिस्टम डेफिनिशन लैंग्वेज" के रूप में जाना जाता है। ग्राफ़क्यूएल प्रकार, सिद्धांत रूप में, किसी भी भाषा में परिभाषित किए जा सकते हैं, लेकिन सबसे आम अज्ञेय भाषा एसडीएल है, तो आइए एपीआई को परिभाषित करने के लिए एसडीएल का उपयोग करें।
type Artist {
name: String!
songs: [Song]
origin: [String]
}
type Song {
name: String!
artist: Artist
duration: Int
release: String
}
एक कलाकार एक name
है वह एक String
है . विस्मयादिबोधक चिह्न का अर्थ है कि फ़ील्ड non-null
है . songs
गीत . की एक सरणी है ऑब्जेक्ट, और origin
जो एक String
है सरणी। गीत समान है लेकिन एक विषम क्षेत्र के साथ। release
फ़ील्ड एक समय या दिनांक प्रकार होना चाहिए लेकिन ग्राफ़क्यूएल में उस प्रकार को कोर प्रकार के रूप में परिभाषित नहीं किया गया है। विभिन्न ग्राफक्यूएल कार्यान्वयनों के बीच पूर्ण सुवाह्यता के लिए, एक String
प्रयोग किया जाता है। हम जिस ग्राफक्यूएल कार्यान्वयन का उपयोग करेंगे, उसमें Time
होगा प्रकार जोड़ा गया तो चलिए गीत को बदलते हैं परिभाषा ताकि release
फ़ील्ड एक Time
है प्रकार। लौटाया गया मान एक String
होगा , लेकिन प्रकार को Time
. पर सेट करके हम एपीआई को अधिक सटीक रूप से दस्तावेज करते हैं।
release: Time
अंतिम चरण यह वर्णन करना है कि एक या अधिक वस्तुओं को कैसे प्राप्त किया जाए। इसे रूट या, प्रश्नों के लिए, क्वेरी रूट के रूप में संदर्भित किया जाता है। हमारे रूट में केवल एक फ़ील्ड या विधि होगी जिसे artist
. कहा जाता है और इसके लिए एक कलाकार की आवश्यकता होगी name
।
type Query {
artist(name: String!): Artist
}
आवेदन लिखना
आइए देखें कि हम इसे किसी एप्लिकेशन में कैसे उपयोग करेंगे। रूबी के लिए ग्राफक्यूएल सर्वर के कई कार्यान्वयन हैं। कुछ दृष्टिकोणों के लिए उपरोक्त एसडीएल को रूबी समकक्ष में अनुवादित करने की आवश्यकता होती है। एगू, एक HTTP सर्वर जिसे मैंने बनाया है, एसडीएल परिभाषा का उपयोग करता है और रूबी कोड सादा वेनिला रूबी है, इसलिए हम इसका उपयोग करेंगे।
ध्यान दें कि रूबी कक्षाएं ग्राफक्यूएल प्रकारों से मेल खाती हैं। रूबी वर्ग के नाम GraphQL प्रकार के नामों से मेल खाने से, हम कोई अनावश्यक जटिलता नहीं जोड़ते हैं।
class Artist
attr_reader :name
attr_reader :songs
attr_reader :origin
def initialize(name, origin)
@name = name
@songs = []
@origin = origin
end
# Only used by the Song to add itself to the artist.
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={}
. ग्राफक्यूएल एपीआई यही उम्मीद करते हैं और यहां हमारा कार्यान्वयन सूट का पालन करता है। initialize
उदाहरण के लिए डेटा सेट करने के लिए विधियों का उपयोग किया जाता है, जैसा कि हम जल्द ही देखेंगे।
क्वेरी रूट क्लास को भी परिभाषित करने की आवश्यकता है। artist
पर ध्यान दें विधि जो एसडीएल से मेल खाती है Query
जड़ प्रकार। एक attr_reader
artists
. के लिए भी जोड़ा गया। यह केवल उस फ़ील्ड को Query
. में जोड़कर एपीआई के संपर्क में आ जाएगा एसडीएल दस्तावेज़ में टाइप करें।
class Query
attr_reader :artists
def initialize(artists)
@artists = artists
end
def artist(args={})
@artists[args['name']]
end
end
GraphQL रूट (क्वेरी रूट के साथ भ्रमित नहीं होना चाहिए) क्वेरी रूट के ऊपर बैठता है। GraphQL इसे वैकल्पिक रूप से तीन क्षेत्रों के लिए परिभाषित करता है। रूबी वर्ग, इस मामले में, query
. पर लागू होता है खेत। इनिशियलाइज़र न्यूज़ीलैंड के इंडी बैंड के लिए कुछ डेटा लोड करता है जिसे मैं सुनना पसंद करता हूँ।
class Schema
attr_reader :query
attr_reader :mutation
attr_reader :subscription
def initialize()
# Set up some data for testing.
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()
फिर ग्राफ़क्यूएल कार्यान्वयन को पहले परिभाषित एसडीएल के साथ कॉन्फ़िगर किया गया है ($songs_sdl
) और फिर एप्लिकेशन सो जाता है जबकि सर्वर अनुरोधों को संसाधित करता है।
Agoo::GraphQL.schema(Schema.new) {
Agoo::GraphQL.load($songs_sdl)
}
sleep
इस उदाहरण के लिए कोड GitHub पर पाया जा सकता है।
एपीआई का उपयोग करना
एपीआई का परीक्षण करने के लिए, आप एक वेब ब्राउज़र, डाकिया या curl
का उपयोग कर सकते हैं ।
कोशिश करने के लिए ग्राफ़क्यूएल क्वेरी इस तरह दिखती है:
{
artist(name:"Fazerdaze") {
name
songs{
name
duration
}
}
}
क्वेरी कलाकार . के लिए पूछती है नाम Fazerdaze
और name
. लौटाता है और songs
एक JSON दस्तावेज़ में। प्रत्येक गीत . के लिए 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
}
]
}
}
}
क्वेरी में वैकल्पिक व्हाइटस्पेस से छुटकारा पाने के बाद, कर्ल के साथ बने HTTP GET को उस सामग्री को वापस कर देना चाहिए।
curl -w "\n" 'localhost:6464/graphql?query=\{artist(name:"Fazerdaze")\{name,songs\{name,duration\}\}\}&indent=2'
क्वेरी बदलने का प्रयास करें और duration
को बदलें release
. के साथ और रूबी टाइम को JSON स्ट्रिंग में बदलने पर ध्यान दें।
गीत से बाहर
हमें GraphQL के साथ खेलने में मज़ा आया और हम आशा करते हैं कि आपने साथ में टैग किया और रास्ते में कुछ सीखा। धन्यवाद, आप एक महान दर्शक रहे हैं। अगर आप रूबी के बारे में और बात करना चाहते हैं, तो हम मर्चेंट बेचने वाले बार में होंगे।