Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी के साथ ग्राफक्यूएल का एक महत्वपूर्ण परिचय

आपने डेवलपर्स को ग्राफक्यूएल के चमत्कारों की प्रशंसा करते हुए सुना होगा। इस श्रृंखला में हम तकनीकों का उपयोग करके सीखना पसंद करते हैं, और यह लेख एक उदाहरण एप्लिकेशन के माध्यम से जाएगा जो ग्राफ़क्यूएल का उपयोग करता है।

ग्राफक्यूएल क्या है

ग्राफक्यूएल एक क्वेरी भाषा और रनटाइम है जिसका उपयोग एपीआई बनाने के लिए किया जा सकता है। यह विकास स्टैक में 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 के साथ खेलने में मज़ा आया और हम आशा करते हैं कि आपने साथ में टैग किया और रास्ते में कुछ सीखा। धन्यवाद, आप एक महान दर्शक रहे हैं। अगर आप रूबी के बारे में और बात करना चाहते हैं, तो हम मर्चेंट बेचने वाले बार में होंगे।


  1. रूबी के साथ गणित:मोडुलो ऑपरेटर, बाइनरी और अधिक

    क्या आपको एक अच्छा प्रोग्रामर बनने के लिए गणित जानने की आवश्यकता है? यह निर्भर करता है! यदि आप पूरे दिन सीआरयूडी ऐप्स लिखने जा रहे हैं तो आपको शायद ज्यादा गणित जानने की जरूरत नहीं है, यदि कोई हो। लेकिन अगर आप और दिलचस्प चीजें करना चाहते हैं, जैसे कोडिंग चुनौतियों को हल करना और कोडिंग इंटरव्यू के

  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी के साथ एक पार्सर कैसे बनाएं

    पार्सिंग स्ट्रिंग्स के एक गुच्छा को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकते हैं। आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं, लेकिन वे हमेशा कार्य के लिए उपयुक्त नहीं होते हैं। उदाहरण के लिए, यह सामान्य ज्ञान है कि नियमित अभिव्यक्तियों के साथ HTML को पार्स करना शायद एक अच्छ