Промежуточное ПО и 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)
- Хеш заголовков
- Тело, отвечающее на
each(обычно массив строк)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }Хеш env
Аргумент env — это хеш с описанием запроса.
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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы Sinatra
- Маршруты и параметры
- API JSON
- Промежуточное ПО и Rack