مقدمه
GraphQL یک زبان پرسوجوی قدرتمند برای APIها و همچنین یک محیط اجرایی سمت سرور برای اجرای این پرسوجوها روی دادههای موجود است. GraphQL به کلاینتها اجازه میدهد در یک درخواست، چندین منبع داده را از سرور دریافت کنند و دقیقاً مشخص کنند چه دادههایی نیاز دارند. این ویژگی باعث کاهش تعداد درخواستهای API و افزایش کارایی میشود.
GraphQL مستقل از زبان برنامهنویسی و پایگاه داده است و تقریباً در هر زبان و دیتابیسی قابل پیادهسازی است.
در این آموزش، یک API یادداشتبرداری (Note Taking) مبتنی بر Ruby on Rails و GraphQL ایجاد میکنید. پس از پایان آموزش، قادر خواهید بود از طریق GraphQL یادداشتهای جدید ایجاد کرده و یادداشتهای موجود را مشاهده کنید.
پیشنیازها
برای دنبال کردن این آموزش به موارد زیر نیاز دارید:
Ruby نسخه 2.6.3
Ruby on Rails نسخه 6.0.2.1
PostgreSQL نسخه 11.2
آشنایی اولیه با Rails و پایگاه داده PostgreSQL
مرحله اول: ایجاد پروژه Rails API
ابتدا یک پروژه Rails API جدید ایجاد کنید:
rails new rails_graphql -d=postgresql -T –api
توضیح پارامترها:
پارامتر توضیح
-d=postgresql استفاده از PostgreSQL
-T عدم ایجاد فایلهای تست
–api ساخت پروژه فقط برای API
سپس وارد پوشه پروژه شوید:
cd rails_graphql
ایجاد پایگاه داده
فایل تنظیمات دیتابیس در مسیر زیر قرار دارد:
config/database.yml
برای ایجاد دیتابیسها دستور زیر را اجرا کنید:
rails db:create
خروجی:
Created database ‘rails_graphql_development’
Created database ‘rails_graphql_test’
اجرای پروژه
bundle exec rails server
یا روی سرور:
bundle exec rails server –binding=YOUR_SERVER_IP
مرورگر را باز کنید:
http://localhost:3000
اگر صفحه خوشآمدگویی Rails را مشاهده کردید، همه چیز درست است.
مرحله دوم: نصب GraphQL روی Rails
برای اضافه کردن GraphQL فایل Gemfile را باز کنید:
group :development do
gem ‘graphiql-rails’
end
gem ‘graphql’, ‘1.9.18’
سپس نصب کنید:
bundle install
نصب فایلهای اولیه GraphQL
rails g graphql:install
این دستور:
مسیر /graphql را ایجاد میکند.
کنترلر GraphQL را میسازد.
پوشه app/graphql را ایجاد میکند.
فعالسازی GraphiQL
فایل:
config/routes.rb
را ویرایش کنید:
Rails.application.routes.draw do
if Rails.env.development?
mount GraphiQL::Rails::Engine,
at: “/graphiql”,
graphql_path: “graphql#execute”
end
post “/graphql”, to: “graphql#execute”
end
فعالسازی Asset Pipeline
در فایل:
config/application.rb
خط زیر را از حالت کامنت خارج کنید:
require “sprockets/railtie”
پوشه زیر را ایجاد کنید:
mkdir -p app/assets/config
فایل:
app/assets/config/manifest.js
را بسازید:
//= link graphiql/rails/application.css
//= link graphiql/rails/application.js
تست GraphQL
سرور را مجدد اجرا کنید:
bundle exec rails server
سپس آدرس زیر را باز کنید:
http://localhost:3000/graphiql
در محیط GraphiQL کوئری زیر را اجرا کنید:
query {
testField
}
اگر پاسخ دریافت کردید، GraphQL به درستی نصب شده است.
مرحله سوم: ایجاد مدل Note
مدل یادداشت را ایجاد کنید:
rails generate model note title:string:index body:text
سپس Migration را اجرا کنید:
rails db:migrate
خروجی:
create_table(:notes)
add_index(:notes, :title)
ساخت GraphQL Type
برای ساخت NoteType:
rails generate graphql:object Note id:ID! title:String! body:String!
این Type شامل فیلدهای زیر خواهد بود:
type Note {
id: ID!
title: String!
body: String!
}
ساخت Input Type
فایل زیر را ایجاد کنید:
app/graphql/types/input/note_input_type.rb
محتوا:
module Types
module Input
class NoteInputType < Types::BaseInputObject
argument :title, String, required: true
argument :body, String, required: true
end
end
end
مرحله چهارم: ایجاد Query ها
Query دریافت تمام یادداشتها
فایل:
app/graphql/queries/fetch_notes.rb
module Queries
class FetchNotes < Queries::BaseQuery
type [Types::NoteType], null: false
def resolve
Note.all.order(created_at: :desc)
end
end
end
اتصال Query به GraphQL
فایل:
app/graphql/types/query_type.rb
field :fetch_notes,
resolver: Queries::FetchNotes
ایجاد داده آزمایشی
فایل:
db/seeds.rb
5.times do |i|
Note.create(
title: “Note #{i+1}”,
body: “Lorem ipsum saves lives”
)
end
اجرا:
rails db:seed
اجرای Query
در GraphiQL:
query {
fetchNotes {
id
title
body
}
}
خروجی:
{
“data”: {
“fetchNotes”: [
{
“id”:”1″,
“title”:”Note 1″,
“body”:”Lorem ipsum saves lives”
}
]
}
}
دریافت یک یادداشت بر اساس ID
فایل:
app/graphql/queries/fetch_note.rb
module Queries
class FetchNote < Queries::BaseQuery
type Types::NoteType, null: false
argument :id, ID, required: true
def resolve(id:)
Note.find(id)
rescue ActiveRecord::RecordNotFound
GraphQL::ExecutionError.new(
“یادداشت پیدا نشد”
)
end
end
end
در فایل QueryType:
field :fetch_note,
resolver: Queries::FetchNote
کوئری:
query {
fetchNote(id: 1) {
id
title
body
}
}
مرحله پنجم: ایجاد Mutation
Mutation برای ساخت یادداشت جدید:
app/graphql/mutations/add_note.rb
module Mutations
class AddNote < Mutations::BaseMutation
argument :params,
Types::Input::NoteInputType,
required: true
field :note,
Types::NoteType,
null: false
def resolve(params:)
note = Note.create!(params.to_h)
{
note: note
}
end
end
end
اتصال Mutation
فایل:
app/graphql/types/mutation_type.rb
module Types
class MutationType < Types::BaseObject
field :add_note,
mutation: Mutations::AddNote
end
end
تست Mutation
در GraphiQL:
mutation {
addNote(
input: {
params: {
title: “GraphQL Notes”
body: “A long body of text”
}
}
) {
note {
id
title
body
}
}
}
خروجی:
{
“data”: {
“addNote”: {
“note”: {
“id”:”6″,
“title”:”GraphQL Notes”,
“body”:”A long body of text”
}
}
}
}
جمعبندی
در این آموزش یاد گرفتید:
✅ ایجاد پروژه Rails API
✅ اتصال Rails به PostgreSQL
✅ نصب و پیکربندی GraphQL
✅ راهاندازی GraphiQL
✅ ساخت مدل Note
✅ ایجاد Query برای دریافت دادهها
✅ ایجاد Mutation برای ثبت دادهها
✅ کار با Type و Input Type در GraphQL
در پایان یک API کامل یادداشتبرداری مبتنی بر Ruby on Rails + PostgreSQL + GraphQL ساختید که قابلیت دریافت و ایجاد یادداشتها را از طریق GraphQL فراهم میکند.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران