কম্পিউটার

রেলের সাথে এপিআই তৈরি করা

আজকাল APIs (অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস) এর উপর খুব বেশি নির্ভর করা একটি সাধারণ অভ্যাস। Facebook এবং Twitter-এর মতো বড় পরিষেবাগুলিই কেবল তাদের নিয়োগ করে না — ক্লায়েন্ট-সাইড ফ্রেমওয়ার্ক যেমন প্রতিক্রিয়া, কৌণিক, এবং আরও অনেকের বিস্তারের কারণে APIগুলি খুব জনপ্রিয়। Ruby on Rails এই প্রবণতা অনুসরণ করছে, এবং সর্বশেষ সংস্করণটি একটি নতুন বৈশিষ্ট্য উপস্থাপন করে যা আপনাকে শুধুমাত্র API-এর অ্যাপ্লিকেশন তৈরি করার অনুমতি দেয়।

প্রাথমিকভাবে এই কার্যকারিতাটি rails-api নামক একটি পৃথক রত্ন-এ প্যাক করা হয়েছিল, কিন্তু Rails 5 প্রকাশের পর থেকে, এটি এখন কাঠামোর মূল অংশ। ActionCable সহ এই বৈশিষ্ট্যটি সম্ভবত সবচেয়ে প্রত্যাশিত ছিল, এবং তাই আজ আমরা এটি নিয়ে আলোচনা করতে যাচ্ছি৷

এই নিবন্ধটি কভার করে যে কীভাবে এপিআই-শুধু রেল অ্যাপ্লিকেশন তৈরি করতে হয় এবং কীভাবে আপনার রুট এবং কন্ট্রোলার গঠন করতে হয়, JSON ফর্ম্যাটের সাথে সাড়া দিতে হয়, সিরিয়ালাইজার যোগ করতে হয় এবং CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) সেট আপ করতে হয় তা ব্যাখ্যা করে। আপনি এপিআই সুরক্ষিত এবং অপব্যবহার থেকে রক্ষা করার জন্য কিছু বিকল্প সম্পর্কেও শিখবেন।

এই নিবন্ধের উৎস GitHub এ উপলব্ধ।

একটি API-কেবল অ্যাপ্লিকেশন তৈরি করা

শুরু করতে, নিম্নলিখিত কমান্ডটি চালান:

rails new RailsApiDemo --api

এটি RailsApiDemo নামে একটি নতুন API-শুধু রেল অ্যাপ্লিকেশন তৈরি করতে চলেছে . ভুলে যাবেন না যে --api-এর জন্য সমর্থন বিকল্পটি শুধুমাত্র Rails 5 এ যোগ করা হয়েছে, তাই নিশ্চিত করুন যে আপনি এটি বা একটি নতুন সংস্করণ ইনস্টল করেছেন৷

Gemfile  খুলুন এবং মনে রাখবেন যে এটি স্বাভাবিকের চেয়ে অনেক ছোট:রত্ন যেমন coffee-rails , turbolinks , এবং sass-rails চলে গেছে।

config/application.rb  ফাইলটিতে একটি নতুন লাইন রয়েছে:

config.api_only = true

এর অর্থ হল রেলগুলি মিডলওয়্যারের একটি ছোট সেট লোড করতে চলেছে:উদাহরণস্বরূপ, কোনও কুকিজ এবং সেশন সমর্থন নেই৷ তাছাড়া, আপনি একটি ভারা তৈরি করার চেষ্টা করলে, ভিউ এবং সম্পদ তৈরি করা হবে না। আসলে, আপনি যদি দর্শন/লেআউটগুলি চেক করেন ডিরেক্টরিতে, আপনি লক্ষ্য করবেন যে application.html.erb ফাইলটিও অনুপস্থিত৷

আরেকটি গুরুত্বপূর্ণ পার্থক্য হল ApplicationController ActionController::API থেকে উত্তরাধিকারসূত্রে প্রাপ্ত , ActionController::Base নয় .

এটি মোটামুটিই - সব মিলিয়ে, এটি একটি মৌলিক রেল অ্যাপ্লিকেশন যা আপনি অনেকবার দেখেছেন৷ এখন আসুন কয়েকটি মডেল যুক্ত করি যাতে আমাদের সাথে কাজ করার কিছু থাকে:

rails g model User name:string
rails g model Post title:string body:text user:belongs_to
rails db:migrate

এখানে অভিনব কিছু হচ্ছে না:একটি শিরোনাম সহ একটি পোস্ট, এবং একটি বডি একজন ব্যবহারকারীর অন্তর্গত৷

নিশ্চিত করুন যে যথাযথ অ্যাসোসিয়েশনগুলি সেট আপ করা হয়েছে এবং কিছু সহজ বৈধতা পরীক্ষাও প্রদান করে:

models/user.rb

  has_many :posts

  validates :name, presence: true

models/post.rb

  belongs_to :user

  validates :title, presence: true
  validates :body, presence: true

উজ্জ্বল ! পরবর্তী ধাপ হল সদ্য তৈরি করা টেবিলে কয়েকটি নমুনা রেকর্ড লোড করা।

ডেমো ডেটা লোড হচ্ছে

কিছু ডেটা লোড করার সবচেয়ে সহজ উপায় হল seeds.rb ব্যবহার করে db এর ভিতরে ফাইল ডিরেক্টরি যাইহোক, আমি অলস (যেমন অনেক প্রোগ্রামার আছে) এবং কোন নমুনা বিষয়বস্তু নিয়ে ভাবতে চাই না। অতএব, আমরা কেন এমন নকল রত্ন ব্যবহার করব না যা বিভিন্ন ধরণের এলোমেলো ডেটা তৈরি করতে পারে:নাম, ইমেল, হিপস্টার শব্দ, "লোরেম ইপসাম" পাঠ্য এবং আরও অনেক কিছু৷

জেমফাইল

group :development do
    gem 'faker'
end

রত্নটি ইনস্টল করুন:

bundle install

এখন seeds.rb টুইক করুন :

db/seeds.rb

5.times do
  user = User.create({name: Faker::Name.name})
  user.posts.create({title: Faker::Book.title, body: Faker::Lorem.sentence})
end

অবশেষে, আপনার ডেটা লোড করুন:

rails db:seed

JSON এর সাথে সাড়া দেওয়া

এখন, অবশ্যই, আমাদের API তৈরি করার জন্য আমাদের কিছু রুট এবং কন্ট্রোলার প্রয়োজন। API এর রুটগুলিকে api/ এর অধীনে নেস্ট করা একটি সাধারণ অভ্যাস পথ এছাড়াও, বিকাশকারীরা সাধারণত পাথে API এর সংস্করণ প্রদান করে, উদাহরণস্বরূপ api/v1/ . পরে, যদি কিছু ব্রেকিং পরিবর্তন প্রবর্তন করতে হয়, আপনি কেবল একটি নতুন নামস্থান তৈরি করতে পারেন (v2 ) এবং একটি পৃথক নিয়ামক।

আপনার রুটগুলি দেখতে কেমন হতে পারে তা এখানে:

config/routes.rb

namespace 'api' do
    namespace 'v1' do
      resources :posts
      resources :users
    end
end

এটি রুট তৈরি করে যেমন:

api_v1_posts GET    /api/v1/posts(.:format)     api/v1/posts#index
             POST   /api/v1/posts(.:format)     api/v1/posts#create
 api_v1_post GET    /api/v1/posts/:id(.:format) api/v1/posts#show

আপনি একটি scope ব্যবহার করতে পারেন namespace এর পরিবর্তে পদ্ধতি , কিন্তু তারপর ডিফল্টরূপে এটি UsersController এর সন্ধান করবে এবং PostsController নিয়ন্ত্রকদের ভিতরে ডিরেক্টরি, কন্ট্রোলার/api/v1-এর ভিতরে নয় , তাই সাবধান।

api তৈরি করুন নেস্টেড ডিরেক্টরি v1 সহ ফোল্ডার নিয়ন্ত্রকদের ভিতরে . এটিকে আপনার কন্ট্রোলারের সাথে পপুলেট করুন:

controllers/api/v1/users_controller.rb

module Api
    module V1
        class UsersController < ApplicationController
        end
    end
end

controllers/api/v1/posts_controller.rb

module Api
    module V1
        class PostsController < ApplicationController
        end
    end
end

মনে রাখবেন যে আপনাকে শুধুমাত্র api/v1-এর অধীনে নিয়ামকের ফাইল নেস্ট করতে হবে না path, কিন্তু ক্লাসকেও Api-এর ভিতরে নামস্থান রাখতে হবে এবং V1 মডিউল।

পরবর্তী প্রশ্ন হল কিভাবে সঠিকভাবে JSON- ফরম্যাটেড ডেটার সাথে সাড়া দেওয়া যায়? এই নিবন্ধে আমরা এই সমাধানগুলি চেষ্টা করব:jBuilder এবং active_model_serializers রত্ন। তাই পরবর্তী বিভাগে যাওয়ার আগে, সেগুলিকে Gemfile-এ ফেলে দিন৷ :

জেমফাইল

gem 'jbuilder', '~> 2.5'
gem 'active_model_serializers', '~> 0.10.0'

তারপর চালান:

bundle install

jBuilder রত্ন ব্যবহার করা

jBuilder হল Rails টিম দ্বারা রক্ষণাবেক্ষণ করা একটি জনপ্রিয় রত্ন যা একটি সাধারণ DSL (ডোমেন-নির্দিষ্ট ভাষা) প্রদান করে যা আপনাকে আপনার দৃষ্টিভঙ্গিতে JSON কাঠামো সংজ্ঞায়িত করতে দেয়।

ধরুন যখন কোনো ব্যবহারকারী index হিট করে তখন আমরা সমস্ত পোস্ট প্রদর্শন করতে চেয়েছিলাম কর্ম:

controllers/api/v1/posts_controller.rb

 def index
    @posts = Post.order('created_at DESC')
end

আপনাকে যা করতে হবে তা হল .json.jbuilder-এর সাথে সংশ্লিষ্ট কর্মের নামে নামকরণ করা ভিউ তৈরি এক্সটেনশন মনে রাখবেন যে ভিউটি অবশ্যই api/v1-এর অধীনে রাখতে হবে পথও:

views/api/v1/posts/index.json.jbuilder

json.array! @posts do |post|
  json.id post.id
  json.title post.title
  json.body post.body
end

json.array! @posts অতিক্রম করে অ্যারে json.id , json.title এবং json.body আর্গুমেন্টগুলিকে মান হিসাবে সেট করে সংশ্লিষ্ট নামের সাথে কীগুলি তৈরি করুন। আপনি যদি https://localhost:3000/api/v1/posts.json-এ নেভিগেট করেন, তাহলে আপনি এইটির মতো একটি আউটপুট দেখতে পাবেন:

[
    {"id": 1, "title": "Title 1", "body": "Body 1"},
    {"id": 2, "title": "Title 2", "body": "Body 2"}
]

যদি আমরা প্রতিটি পোস্টের জন্য লেখককেও প্রদর্শন করতে চাই? এটা সহজ:

json.array! @posts do |post|
  json.id post.id
  json.title post.title
  json.body post.body
  json.user do
    json.id post.user.id
    json.name post.user.name
  end
end

আউটপুট পরিবর্তিত হবে:

[
    {"id": 1, "title": "Title 1", "body": "Body 1", "user": {"id": 1, "name": "Username"}}
]

.jbuilder এর বিষয়বস্তু ফাইলগুলি সাধারণ রুবি কোড, তাই আপনি যথারীতি সমস্ত মৌলিক ক্রিয়াকলাপগুলি ব্যবহার করতে পারেন৷

মনে রাখবেন যে jBuilder যেকোন সাধারণ রেল ভিউয়ের মতই আংশিক সমর্থন করে, তাই আপনি বলতে পারেন: 

json.partial! partial: 'posts/post', collection: @posts, as: :post

এবং তারপর views/api/v1/posts/_post.json.jbuilder তৈরি করুন নিম্নলিখিত বিষয়বস্তু সহ ফাইল:

json.id post.id
json.title post.title
json.body post.body
json.user do
    json.id post.user.id
    json.name post.user.name
end

সুতরাং, আপনি দেখতে পাচ্ছেন, jBuilder সহজ এবং সুবিধাজনক। যাইহোক, বিকল্প হিসাবে, আপনি সিরিয়ালাইজারগুলির সাথে লেগে থাকতে পারেন, তাই আসুন পরবর্তী বিভাগে সেগুলি নিয়ে আলোচনা করা যাক৷

সিরিয়ালাইজার ব্যবহার করা

rails_model_serializers রত্নটি একটি দল তৈরি করেছে যারা প্রাথমিকভাবে rails-api পরিচালনা করেছিল। ডকুমেন্টেশনে যেমন বলা হয়েছে, rails_model_serializers আপনার JSON জেনারেশনে কনফিগারেশন ওভার কনভেনশন নিয়ে আসে। মূলত, আপনি নির্ধারণ করেন যে কোন ক্ষেত্রগুলি সিরিয়ালাইজেশনের সময় ব্যবহার করা উচিত (অর্থাৎ, JSON প্রজন্ম)।

এখানে আমাদের প্রথম সিরিয়ালাইজার:

serializers/post_serializer.rb

class PostSerializer < ActiveModel::Serializer
  attributes :id, :title, :body
end

এখানে আমরা বলি যে এই সমস্ত ক্ষেত্রগুলি ফলস্বরূপ JSON-এ উপস্থিত হওয়া উচিত। এখন to_json এর মত পদ্ধতি এবং as_json একটি পোস্টে ডাকা এই কনফিগারেশন ব্যবহার করবে এবং সঠিক বিষয়বস্তু ফিরিয়ে দেবে।

এটিকে কার্যকরভাবে দেখতে, index পরিবর্তন করুন এই মত কর্ম:

controllers/api/v1/posts_controller.rb

def index
    @posts = Post.order('created_at DESC')
    
    render json: @posts
end

as_json স্বয়ংক্রিয়ভাবে @posts ডাকা হবে বস্তু।

ব্যবহারকারীদের সম্পর্কে কি? সিরিয়ালাইজার আপনাকে সম্পর্ক নির্দেশ করতে দেয়, ঠিক যেমন মডেলগুলি করে। আরও কী, সিরিয়ালাইজারগুলি নেস্ট করা যেতে পারে:

serializers/post_serializer.rb

class PostSerializer < ActiveModel::Serializer
  attributes :id, :title, :body
  belongs_to :user

  class UserSerializer < ActiveModel::Serializer
    attributes :id, :name
  end
end

এখন আপনি যখন পোস্টটি সিরিয়াল করবেন, এটি স্বয়ংক্রিয়ভাবে নেস্ট করা user ধারণ করবে এর আইডি এবং নাম সহ কী। পরে যদি আপনি :id ব্যবহারকারীর জন্য একটি পৃথক সিরিয়ালাইজার তৈরি করেন বৈশিষ্ট্য বাদ দেওয়া হয়েছে:

serializers/post_serializer.rb

class UserSerializer < ActiveModel::Serializer
    attributes :name
end

তারপর @user.as_json ব্যবহারকারীর আইডি ফেরত দেবে না। তবুও, @post.as_json ব্যবহারকারীর নাম এবং আইডি উভয়ই ফিরিয়ে দেবে, তাই এটি মনে রাখবেন।

এপিআই সুরক্ষিত করা

অনেক ক্ষেত্রে, আমরা চাই না যে কেউ এপিআই ব্যবহার করে কোনো কাজ করুক। তাই আসুন একটি সাধারণ নিরাপত্তা পরীক্ষা উপস্থাপন করি এবং পোস্ট তৈরি এবং মুছে ফেলার সময় আমাদের ব্যবহারকারীদের তাদের টোকেন পাঠাতে বাধ্য করি।

টোকেনটির একটি সীমাহীন আয়ু থাকবে এবং ব্যবহারকারীর নিবন্ধনের পরে এটি তৈরি করা হবে। প্রথমত, একটি নতুন token যোগ করুন users কলাম টেবিল:

rails g migration add_token_to_users token:string:index

এই সূচকটি স্বতন্ত্রতার গ্যারান্টি দেওয়া উচিত কারণ একই টোকেন সহ দুটি ব্যবহারকারী থাকতে পারে না:

db/migrate/xyz_add_token_to_users.rb

add_index :users, :token, unique: true

মাইগ্রেশন প্রয়োগ করুন:

rails db:migrate

এখন before_save যোগ করুন কলব্যাক:

models/user.rb

before_create -> {self.token = generate_token}

generate_token ব্যক্তিগত পদ্ধতি একটি অন্তহীন চক্রে একটি টোকেন তৈরি করবে এবং এটি অনন্য কিনা তা পরীক্ষা করবে। যত তাড়াতাড়ি একটি অনন্য টোকেন পাওয়া যায়, এটি ফেরত দিন:

models/user.rb

private

def generate_token
    loop do
      token = SecureRandom.hex
      return token unless User.exists?({token: token})
    end
end

আপনি টোকেন তৈরি করতে অন্য অ্যালগরিদম ব্যবহার করতে পারেন, উদাহরণস্বরূপ ব্যবহারকারীর নামের MD5 হ্যাশ এবং কিছু লবণের উপর ভিত্তি করে৷

ব্যবহারকারী নিবন্ধন

অবশ্যই, আমাদের ব্যবহারকারীদের নিবন্ধন করার অনুমতি দিতে হবে, কারণ অন্যথায় তারা তাদের টোকেন পেতে সক্ষম হবে না। আমি আমাদের অ্যাপ্লিকেশনে কোনো HTML ভিউ প্রবর্তন করতে চাই না, তাই এর পরিবর্তে একটি নতুন API পদ্ধতি যোগ করা যাক:

controllers/api/v1/users_controller.rb

def create
    @user = User.new(user_params)
    if @user.save
      render status: :created
    else
      render json: @user.errors, status: :unprocessable_entity
    end
end

private

def user_params
    params.require(:user).permit(:name)
end

অর্থপূর্ণ HTTP স্ট্যাটাস কোডগুলি ফেরত দেওয়া একটি ভাল ধারণা যাতে বিকাশকারীরা ঠিক কী ঘটছে তা বুঝতে পারে৷ এখন আপনি ব্যবহারকারীদের জন্য একটি নতুন সিরিয়ালাইজার প্রদান করতে পারেন অথবা একটি .json.jbuilder এর সাথে লেগে থাকতে পারেন ফাইল আমি পরবর্তী রূপটি পছন্দ করি (তাই আমি :json পাস করি না render-এর বিকল্প পদ্ধতি), কিন্তু আপনি তাদের যেকোনো একটি বেছে নিতে স্বাধীন। মনে রাখবেন, যাইহোক, টোকেনটি অবশ্যই হবে না সর্বদা সিরিয়ালাইজড, উদাহরণস্বরূপ যখন আপনি সমস্ত ব্যবহারকারীর একটি তালিকা ফেরত দেন—এটি নিরাপদ রাখা উচিত!

views/api/v1/users/create.json.jbuilder

json.id @user.id
json.name @user.name
json.token @user.token

পরবর্তী ধাপ হল সবকিছু ঠিকঠাক কাজ করছে কিনা তা পরীক্ষা করা। আপনি হয় curl ব্যবহার করতে পারেন কিছু রুবি কোড কমান্ড বা লিখুন। যেহেতু এই নিবন্ধটি রুবি সম্পর্কে, আমি কোডিং বিকল্পের সাথে যাব।

ব্যবহারকারীর নিবন্ধন পরীক্ষা করা হচ্ছে

একটি HTTP অনুরোধ সম্পাদন করার জন্য, আমরা ফ্যারাডে রত্ন নিযুক্ত করব, যেটি অনেক অ্যাডাপ্টারের উপর একটি সাধারণ ইন্টারফেস প্রদান করে (ডিফল্ট হল Net::HTTP ) একটি পৃথক রুবি ফাইল তৈরি করুন, ফ্যারাডে অন্তর্ভুক্ত করুন এবং ক্লায়েন্ট সেট আপ করুন:

api_client.rb

require 'faraday'

client = Faraday.new(url: 'https://localhost:3000') do |config|
  config.adapter  Faraday.default_adapter
end

response = client.post do |req|
  req.url '/api/v1/users'
  req.headers['Content-Type'] = 'application/json'
  req.body = '{ "user": {"name": "test user"} }'
end

এই সমস্ত বিকল্পগুলি বেশ স্ব-ব্যাখ্যামূলক:আমরা ডিফল্ট অ্যাডাপ্টার বেছে নিই, অনুরোধ URLটিকে https://localhost:300/api/v1/users-এ সেট করি, বিষয়বস্তুর ধরণকে application/json এ পরিবর্তন করি , এবং আমাদের অনুরোধের মূল অংশ প্রদান করুন।

সার্ভারের প্রতিক্রিয়াতে JSON থাকবে, তাই এটিকে পার্স করতে আমি Oj রত্ন ব্যবহার করব:

api_client.rb

require 'oj'

# client here...

puts Oj.load(response.body)
puts response.status

পার্স করা প্রতিক্রিয়া ছাড়াও, আমি ডিবাগিং উদ্দেশ্যে স্ট্যাটাস কোডও প্রদর্শন করি।

এখন আপনি সহজভাবে এই স্ক্রিপ্টটি চালাতে পারেন:

ruby api_client.rb

এবং প্রাপ্ত টোকেনটি কোথাও সংরক্ষণ করুন—আমরা পরবর্তী বিভাগে এটি ব্যবহার করব।

টোকেন দিয়ে প্রমাণীকরণ

টোকেন প্রমাণীকরণ কার্যকর করতে, authenticate_or_request_with_http_token পদ্ধতি ব্যবহার করা যেতে পারে। এটি ActionController::HttpAuthentication::Token::ControllerMethods মডিউলের একটি অংশ, তাই এটি অন্তর্ভুক্ত করতে ভুলবেন না:

controllers/api/v1/posts_controller.rb 

class PostsController < ApplicationController
    include ActionController::HttpAuthentication::Token::ControllerMethods
    # ...
end

একটি নতুন before_action যোগ করুন এবং সংশ্লিষ্ট পদ্ধতি:

controllers/api/v1/posts_controller.rb 

before_action :authenticate, only: [:create, :destroy]

# ...

private

# ...

def authenticate
    authenticate_or_request_with_http_token do |token, options|
      @user = User.find_by(token: token)
    end
end

এখন যদি টোকেন সেট করা না থাকে বা যদি এই ধরনের টোকেন সহ একজন ব্যবহারকারী খুঁজে না পাওয়া যায়, তাহলে একটি 401 ত্রুটি ফেরত দেওয়া হবে, কাজটি কার্যকর করা থেকে বিরত থাকবে৷

মনে রাখবেন যে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগটি HTTPS এর মাধ্যমে করা উচিত, কারণ অন্যথায় টোকেনগুলি সহজেই স্পুফ করা যেতে পারে। অবশ্যই, প্রদত্ত সমাধানটি আদর্শ নয় এবং অনেক ক্ষেত্রে প্রমাণীকরণের জন্য OAuth 2 প্রোটোকল ব্যবহার করা বাঞ্ছনীয়। কমপক্ষে দুটি রত্ন রয়েছে যা এই বৈশিষ্ট্যটিকে সমর্থন করার প্রক্রিয়াটিকে ব্যাপকভাবে সহজ করে তোলে:দারোয়ান এবং oPRO৷

একটি পোস্ট তৈরি করা

আমাদের প্রমাণীকরণ কার্যে দেখতে, create যোগ করুন PostsController-এর কর্ম :

controllers/api/v1/posts_controller.rb 

def create
    @post = @user.posts.new(post_params)
    if @post.save
        render json: @post, status: :created
    else
        render json: @post.errors, status: :unprocessable_entity
    end
end

সঠিক JSON প্রদর্শন করতে আমরা এখানে সিরিয়ালাইজারের সুবিধা গ্রহণ করি। @user ইতিমধ্যেই before_action-এর ভিতরে সেট করা ছিল .

এখন এই সহজ কোড ব্যবহার করে সবকিছু পরীক্ষা করে দেখুন:

api_client.rb

client = Faraday.new(url: 'https://localhost:3000') do |config|
  config.adapter  Faraday.default_adapter
  config.token_auth('127a74dbec6f156401b236d6cb32db0d')
end

response = client.post do |req|
  req.url '/api/v1/posts'
  req.headers['Content-Type'] = 'application/json'
  req.body = '{ "post": {"title": "Title", "body": "Text"} }'
end

token_auth-এ পাস করা আর্গুমেন্টটি প্রতিস্থাপন করুন নিবন্ধনের পরে প্রাপ্ত টোকেন সহ, এবং স্ক্রিপ্টটি চালান।

ruby api_client.rb

একটি পোস্ট মুছে ফেলা

একটি পোস্ট মুছে ফেলা একই ভাবে সম্পন্ন করা হয়. destroy যোগ করুন কর্ম:

controllers/api/v1/posts_controller.rb 

def destroy
    @post = @user.posts.find_by(params[:id])
    if @post
      @post.destroy
    else
      render json: {post: "not found"}, status: :not_found
    end
end

আমরা শুধুমাত্র ব্যবহারকারীদের প্রকৃতপক্ষে তাদের নিজস্ব পোস্টগুলি ধ্বংস করার অনুমতি দিই। পোস্টটি সফলভাবে সরানো হলে, 204 স্ট্যাটাস কোড (কোনও বিষয়বস্তু নেই) ফেরত দেওয়া হবে। বিকল্পভাবে, আপনি মুছে ফেলা পোস্টের আইডি দিয়ে প্রতিক্রিয়া জানাতে পারেন কারণ এটি এখনও মেমরি থেকে পাওয়া যাবে।

এই নতুন বৈশিষ্ট্যটি পরীক্ষা করার জন্য কোডের অংশটি এখানে দেওয়া হল:

api_client.rb

response = client.delete do |req|
  req.url '/api/v1/posts/6'
  req.headers['Content-Type'] = 'application/json'
end

আপনার জন্য কাজ করে এমন একটি নম্বর দিয়ে পোস্টের আইডি প্রতিস্থাপন করুন।

CORS সেট আপ করা হচ্ছে

আপনি যদি আপনার API (ক্লায়েন্ট-সাইড থেকে) অ্যাক্সেস করার জন্য অন্যান্য ওয়েব পরিষেবাগুলি সক্ষম করতে চান তবে CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) সঠিকভাবে সেট আপ করা উচিত। মূলত, CORS ওয়েব অ্যাপ্লিকেশনগুলিকে তৃতীয় পক্ষের পরিষেবাগুলিতে AJAX অনুরোধ পাঠাতে অনুমতি দেয়৷ ভাগ্যক্রমে, র্যাক-কর্স নামে একটি রত্ন রয়েছে যা আমাদের সহজেই সবকিছু সেট আপ করতে সক্ষম করে। এটিকে Gemfile-এ যোগ করুন :

জেমফাইল

gem 'rack-cors'

এটি ইনস্টল করুন:

bundle install

এবং তারপর config/initializers/cors.rb-এর ভিতরে কনফিগারেশন প্রদান করুন ফাইল আসলে, এই ফাইলটি ইতিমধ্যেই আপনার জন্য তৈরি করা হয়েছে এবং এতে একটি ব্যবহারের উদাহরণ রয়েছে৷ আপনি রত্নটির পৃষ্ঠায় কিছু সুন্দর বিস্তারিত ডকুমেন্টেশনও খুঁজে পেতে পারেন।

নিম্নলিখিত কনফিগারেশন, উদাহরণস্বরূপ, যেকোনও পদ্ধতি ব্যবহার করে আপনার API অ্যাক্সেস করার অনুমতি দেবে:

config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '/api/*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

অপব্যবহার প্রতিরোধ

শেষ জিনিসটি আমি এই গাইডে উল্লেখ করতে যাচ্ছি তা হল কিভাবে আপনার API কে অপব্যবহার এবং পরিষেবা আক্রমণের অস্বীকার থেকে রক্ষা করা যায়। র‌্যাক-অ্যাটাক (Kickstarter-এর লোকেদের দ্বারা তৈরি) নামক একটি চমৎকার রত্ন রয়েছে যা আপনাকে ক্লায়েন্টদের কালো তালিকা বা সাদা তালিকাভুক্ত করতে, অনুরোধ সহ সার্ভারের বন্যা রোধ করতে এবং আরও অনেক কিছু করতে দেয়।

রত্নটিকে Gemfile-এ ফেলে দিন :

জেমফাইল

gem 'rack-attack'

এটি ইনস্টল করুন:

bundle install

এবং তারপর rack_attack.rb-এর ভিতরে কনফিগারেশন প্রদান করুন ইনিশিয়ালাইজার ফাইল। রত্ন এর ডকুমেন্টেশন সমস্ত উপলব্ধ বিকল্পের তালিকা করে এবং কিছু ব্যবহারের ক্ষেত্রে পরামর্শ দেয়। এখানে একটি নমুনা কনফিগারেশন রয়েছে যা আপনাকে ছাড়া অন্য কাউকে পরিষেবা অ্যাক্সেস করতে বাধা দেয় এবং প্রতি সেকেন্ডে সর্বোচ্চ 5টি অনুরোধ সীমাবদ্ধ করে:

config/initializers/rack_attack.rb

class Rack::Attack
  safelist('allow from localhost') do |req|
    # Requests are allowed if the return value is truthy
    '127.0.0.1' == req.ip || '::1' == req.ip
  end

  throttle('req/ip', :limit => 5, :period => 1.second) do |req|
    req.ip
  end
end

আরেকটি জিনিস যা করতে হবে তা হল একটি মিডলওয়্যার হিসাবে RackAttack সহ:

config/application.rb

config.middleware.use Rack::Attack

উপসংহার

আমরা এই নিবন্ধের শেষে এসেছি। আশা করি, এখন পর্যন্ত আপনি Rails এর সাথে API তৈরি করার বিষয়ে আরও আত্মবিশ্বাসী বোধ করছেন! মনে রাখবেন যে এটিই একমাত্র উপলব্ধ বিকল্প নয়—আরেকটি জনপ্রিয় সমাধান যা বেশ কিছুদিন ধরে ছিল তা হল গ্রেপ ফ্রেমওয়ার্ক, তাই আপনি এটিও পরীক্ষা করে দেখতে আগ্রহী হতে পারেন।

আপনার কাছে কিছু অস্পষ্ট মনে হলে আপনার প্রশ্ন পোস্ট করতে দ্বিধা করবেন না। আমি আমার সাথে থাকার জন্য আপনাকে ধন্যবাদ, এবং খুশি কোডিং!


  1. রেলের সাথে Tailwind CSS ব্যবহার করা

  2. রেল নিরাপত্তা হুমকি:প্রমাণীকরণ

  3. রেলের সাথে কৌণিক ব্যবহার 5

  4. পাসওয়ার্ড দিয়ে লিনাক্স ব্যবহারকারী তৈরি করুন