0Pricing
Ruby Academy · درس

البرمجيات الوسيطة وRack

مكدس Rack

البرمجيات الوسيطة وRack درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ما هي Rack؟

Rack هي الواجهة الدنيا بين خوادم الويب وأطر عمل Ruby. تعمل Sinatra وRails وغيرها جميعًا فوق Rack.

  • توحّد طريقة تدفق الطلبات والاستجابات
  • تتيح استخدام برمجيات وسيطة قابلة لإعادة الاستخدام
  • تطبيق Rack هو أي كائن يستجيب إلى call(env)
app = lambda do |env|
  [200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end

puts app.call({}).inspect

عقد Rack

يجب أن تُرجع call في تطبيق Rack مصفوفة من ثلاثة عناصر:

  • عدد صحيح يمثّل الحالة (مثلًا 200)
  • Hash يمثّل الترويسات
  • النص الأساسي الذي يستجيب إلى each (وهو عادةً مصفوفة من السلاسل)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }

Hash env

الوسيط env هو Hash يصف الطلب.

  • REQUEST_METHOD مثل GET أو POST
  • PATH_INFO هو المسار المطلوب
  • QUERY_STRING هي معاملات الاستعلام الخام
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"

ما هي البرمجيات الوسيطة؟

تغلّف البرمجيات الوسيطة تطبيقًا لإضافة سلوك قبل وصول الطلب إليه أو بعده.

  • التسجيل والمصادقة والضغط
  • تستجيب كل برمجية وسيطة أيضًا إلى call(env)
  • تستدعي التطبيق التالي في السلسلة
class Logger
  def initialize(app)
    @app = app
  end

  def call(env)
    puts "Request: #{env['PATH_INFO']}"
    @app.call(env)
  end
end

إنشاء فئة برمجية وسيطة

تخزّن البرمجية الوسيطة التطبيق المغلّف وتفوض التنفيذ إليه في call.

  • يتلقى المُنشئ التطبيق الداخلي
  • يمكن لـ call تعديل env ثم تمريره إلى الأمام
  • يمكنها أيضًا تعديل الاستجابة أثناء عودتها
class UpcaseBody
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    new_body = body.map(&:upcase)
    [status, headers, new_body]
  end
end

puts 'Middleware defined'

مكدس البرمجيات الوسيطة

تشكّل البرمجيات الوسيطة مكدسًا. يتدفق الطلب نزولًا إلى التطبيق، ثم تتدفق الاستجابة صعودًا.

  • تعمل البرمجية الوسيطة الخارجية أولًا أثناء الدخول
  • تعمل البرمجية الوسيطة الخارجية أخيرًا أثناء الخروج
inner = lambda { |env| [200, {}, ['core']] }

class Wrap
  def initialize(app); @app = app; end
  def call(env)
    s, h, b = @app.call(env)
    [s, h, b.map { |x| "[#{x}]" }]
  end
end

puts Wrap.new(inner).call({}).last.inspect

استخدام البرمجيات الوسيطة في Sinatra

أضف برمجيات وسيطة إلى تطبيق Sinatra باستخدام use.

  • use Rack::Logger
  • يحدد ترتيب استدعاءات use ترتيب المكدس
require 'sinatra'

use Rack::Logger

get '/' do
  'Logged request'
end

config.ru وrackup

يشغّل ملف config.ru تطبيق Rack باستخدام rackup أو Puma.

  • يحدد run التطبيق النهائي
  • يضيف use البرمجيات الوسيطة قبله
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Application

برمجيات وسيطة مضمّنة شائعة

تأتي Rack مع برمجيات وسيطة مفيدة.

  • Rack::CommonLogger لتسجيل الطلبات
  • Rack::Deflater لضغط gzip
  • Rack::Static لتقديم الملفات
  • Rack::Session::Cookie للجلسات
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'

تعديل الاستجابة

غالبًا ما تضيف البرمجية الوسيطة ترويسات الاستجابة بعد انتهاء تشغيل التطبيق الداخلي.

  • التقط ثلاثية الاستجابة
  • عدّل الترويسات ثم أعدها
class AddHeader
  def initialize(app); @app = app; end
  def call(env)
    status, headers, body = @app.call(env)
    headers['X-Powered-By'] = 'Ruby'
    [status, headers, body]
  end
end

app = AddHeader.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[1].inspect

إيقاف الطلبات مبكرًا

يمكن للبرمجية الوسيطة إيقاف الطلب من دون استدعاء التطبيق الداخلي.

  • يفيد ذلك في بوابات المصادقة أو حدود معدل الطلبات
  • أرجع ثلاثية الاستجابة مباشرةً
class Auth
  def initialize(app); @app = app; end
  def call(env)
    return [401, {}, ['Unauthorized']] unless env['token']
    @app.call(env)
  end
end

app = Auth.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[0]

تحقق سريع

تحقق من فهمك لـ Rack.

مراجعة

لقد تعلمت مكدس Rack:

  • Rack هي الواجهة المشتركة التي تقع أسفل أطر عمل الويب في Ruby
  • يستجيب تطبيق Rack إلى call(env) ويُرجع [status, headers, body]
  • تغلّف البرمجية الوسيطة تطبيقًا لإضافة سلوك عابر للمكونات
  • استخدم use في Sinatra أو config.ru لتركيب المكدس
  • يمكن للبرمجية الوسيطة تعديل الاستجابات أو إيقاف الطلبات مبكرًا

الأسئلة الشائعة

هل درس «البرمجيات الوسيطة وRack» مجاني؟

نعم — نص درس «البرمجيات الوسيطة وRack» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ماذا ستتعلم في «البرمجيات الوسيطة وRack»؟

مكدس Rack تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟

لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «البرمجيات الوسيطة وRack»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟

نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات Sinatra
  2. المسارات والمعلمات
  3. واجهات JSON البرمجية
  4. البرمجيات الوسيطة وRack
← العودة إلى Ruby Academy