البرمجيات الوسيطة و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 أو POSTPATH_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'
endconfig.ru وrackup
يشغّل ملف config.ru تطبيق Rack باستخدام rackup أو Puma.
- يحدد
runالتطبيق النهائي - يضيف
useالبرمجيات الوسيطة قبله
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Applicationبرمجيات وسيطة مضمّنة شائعة
تأتي Rack مع برمجيات وسيطة مفيدة.
Rack::CommonLoggerلتسجيل الطلباتRack::Deflaterلضغط gzipRack::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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات Sinatra
- المسارات والمعلمات
- واجهات JSON البرمجية
- البرمجيات الوسيطة وRack