কম্পিউটার

রুবির সাথে GraphQL-এর একটি যন্ত্রমূলক ভূমিকা

আপনি হয়তো ডেভেলপারদের GraphQL-এর বিস্ময়কর গুণগান গাইতে শুনেছেন। এই সিরিজে আমরা প্রযুক্তিগুলি ব্যবহার করে শিখতে চাই, এবং এই নিবন্ধটি একটি উদাহরণের মাধ্যমে যাবে যা গ্রাফকিউএল ব্যবহার করে৷

গ্রাফকিউএল কি

GraphQL হল একটি কোয়েরি ভাষা এবং রানটাইম যা API তৈরি করতে ব্যবহার করা যেতে পারে। এটি একটি REST API হিসাবে ডেভেলপমেন্ট স্ট্যাকে একটি অনুরূপ অবস্থান ধারণ করে কিন্তু আরও নমনীয়তার সাথে। REST এর বিপরীতে, GraphQL প্রতিক্রিয়া বিন্যাস এবং বিষয়বস্তু ক্লায়েন্ট দ্বারা নির্দিষ্ট করার অনুমতি দেয়। ঠিক যেমন SQL SELECT বিবৃতিগুলি ক্যোয়ারী ফলাফল নির্দিষ্ট করার অনুমতি দেয়, GraphQL ফেরত দেওয়া JSON ডেটা স্ট্রাকচারগুলিকে নির্দিষ্ট করার অনুমতি দেয়৷ SQL সাদৃশ্য অনুসরণ করে, GraphQL একটি WHERE প্রদান করে না ক্লজ কিন্তু অ্যাপ্লিকেশন অবজেক্টের ক্ষেত্র সনাক্ত করে যেগুলি প্রতিক্রিয়ার জন্য ডেটা প্রদান করতে হবে।

গ্রাফকিউএল, নাম অনুসারে, এপিআইগুলিকে মডেল করে যেন অ্যাপ্লিকেশনটি ডেটার একটি গ্রাফ। যদিও এই বিবরণটি আপনি আপনার অ্যাপ্লিকেশনকে কীভাবে দেখেন তা নাও হতে পারে, এটি বেশিরভাগ সিস্টেমে ব্যবহৃত একটি মডেল। JSON দ্বারা প্রতিনিধিত্ব করা যেতে পারে এমন ডেটা একটি গ্রাফ যেহেতু JSON শুধুমাত্র একটি নির্দেশিত গ্রাফ। এপিআই এর মাধ্যমে একটি গ্রাফ মডেল উপস্থাপন করার জন্য অ্যাপ্লিকেশনটি সম্পর্কে চিন্তা করলে গ্রাফকিউএল বোঝা অনেক সহজ হবে।

একটি অ্যাপ্লিকেশনে GraphQL ব্যবহার করা

এখন যেহেতু আমরা গ্রাফকিউএলকে বিমূর্তভাবে বর্ণনা করেছি, আসুন প্রকৃতপক্ষে ডেটা মডেল বা গ্রাফের একটি সংজ্ঞা দিয়ে শুরু করে গ্রাফকিউএল ব্যবহার করে এমন একটি অ্যাপ্লিকেশন তৈরিতে নেমে আসি। গত বছর আমি একটি নতুন শখ কুড়ান. আমি ইলেকট্রিক আপরাইট বেস বাজাতে শিখছি সেইসাথে সাধারণভাবে সঙ্গীত সম্পর্কে শিখছি, তাই একটি ডেমো অ্যাপ নিয়ে আসার সময় একটি সঙ্গীত-সম্পর্কিত উদাহরণ মনে এসেছিল৷

উদাহরণে বস্তুর ধরন হল শিল্পী এবং গান . শিল্পী একাধিক গান আছে এবং একটি গান একজন শিল্পীর সাথে যুক্ত . প্রতিটি অবজেক্ট টাইপের বৈশিষ্ট্য আছে যেমন একটি name .

এপিআই সংজ্ঞায়িত করুন

গ্রাফকিউএল এসডিএল (স্কিমা ডেফিনিশন ল্যাঙ্গুয়েজ) ব্যবহার করে যা কখনও কখনও গ্রাফকিউএল স্পেসিফিকেশনে "টাইপ সিস্টেম ডেফিনিশন ল্যাঙ্গুয়েজ" হিসাবে উল্লেখ করা হয়। গ্রাফকিউএল প্রকারগুলি, তাত্ত্বিকভাবে, যে কোনও ভাষায় সংজ্ঞায়িত করা যেতে পারে তবে সবচেয়ে সাধারণ অজ্ঞেয়বাদী ভাষা হল SDL তাই আসুন API-কে সংজ্ঞায়িত করতে SDL ব্যবহার করি৷

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 ক্ষেত্রটি একটি সময় বা তারিখের ধরন হওয়া উচিত কিন্তু GraphQL-এর সেই টাইপটিকে মূল প্রকার হিসাবে সংজ্ঞায়িত করা নেই। বিভিন্ন GraphQL বাস্তবায়নের মধ্যে সম্পূর্ণ বহনযোগ্যতার জন্য, একটি String ব্যবহৃত হয়. আমরা যে GraphQL বাস্তবায়ন ব্যবহার করব তাতে Time আছে টাইপ যোগ করা হয়েছে তাই আসুন গান পরিবর্তন করি সংজ্ঞা যাতে release ক্ষেত্র হল একটি Time প্রকার প্রত্যাবর্তিত মান একটি String হবে , কিন্তু ধরনটিকে Time এ সেট করে আমরা এপিআই আরও নির্ভুলভাবে নথিভুক্ত করি।

  release: Time

শেষ ধাপে এক বা একাধিক বস্তু কিভাবে পাওয়া যায় তা বর্ণনা করা। এটিকে রুট বা, প্রশ্নের জন্য, ক্যোয়ারী রুট হিসাবে উল্লেখ করা হয়। আমাদের রুটে শুধুমাত্র একটি ক্ষেত্র বা পদ্ধতি থাকবে যার নাম artist এবং একজন শিল্পীর name প্রয়োজন হবে .

type Query {
  artist(name: String!): Artist
}

আবেদন লেখা

আসুন আমরা একটি অ্যাপ্লিকেশনে এটি কীভাবে ব্যবহার করব তা দেখি। রুবির জন্য একটি গ্রাফকিউএল সার্ভারের বেশ কয়েকটি বাস্তবায়ন রয়েছে। কিছু পদ্ধতির জন্য উপরের SDLকে রুবি সমতুল্য ভাষায় অনুবাদ করা প্রয়োজন। Agoo, একটি HTTP সার্ভার যা আমি তৈরি করেছি, এটি SDL সংজ্ঞা ব্যবহার করে এবং রুবি কোডটি প্লেইন ভ্যানিলা রুবি, তাই আমরা এটিই ব্যবহার করব৷

মনে রাখবেন যে রুবি ক্লাসগুলি 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={} . GraphQL API গুলি এটাই প্রত্যাশা করে এবং এখানে আমাদের বাস্তবায়ন তাই অনুসরণ করে৷ initialize উদাহরণের জন্য ডেটা সেট আপ করতে পদ্ধতিগুলি ব্যবহার করা হয়, যেমনটি আমরা শীঘ্রই দেখতে পাব।

ক্যোয়ারী রুট শ্রেণীও সংজ্ঞায়িত করা প্রয়োজন। artist নোট করুন পদ্ধতি যা SDL Query এর সাথে মেলে মূল প্রকার। একটি attr_reader artists জন্য এছাড়াও যোগ করা হয়েছিল। Query-এ সেই ক্ষেত্রটি যোগ করার মাধ্যমে এটি API-তে প্রকাশ করা হবে SDL নথিতে টাইপ করুন।

class Query
  attr_reader :artists
 
  def initialize(artists)
    @artists = artists
  end
 
  def artist(args={})
    @artists[args['name']]
  end
end

গ্রাফকিউএল রুট (কোয়েরি রুটের সাথে বিভ্রান্ত না হওয়া) ক্যোয়ারী রুটের উপরে বসে। 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()

GraphQL বাস্তবায়নটি পূর্বে সংজ্ঞায়িত SDL এর সাথে কনফিগার করা হয় ($songs_sdl ) এবং তারপরে সার্ভার অনুরোধগুলি প্রক্রিয়া করার সময় অ্যাপ্লিকেশনটি ঘুমায়৷

Agoo::GraphQL.schema(Schema.new) {
  Agoo::GraphQL.load($songs_sdl)
}
sleep

এই উদাহরণের কোডটি GitHub-এ পাওয়া যাবে।

এপিআই ব্যবহার করা

API পরীক্ষা করতে, আপনি একটি ওয়েব ব্রাউজার, পোস্টম্যান বা 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. রুবি নির্বাচন পদ্ধতি কিভাবে ব্যবহার করবেন (উদাহরণ সহ)

  2. রুবির সাথে গণিত:মডুলো অপারেটর, বাইনারি এবং আরও অনেক কিছু

  3. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  4. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন