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)
  • Хеш заголовков
  • Тело, отвечающее на 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 или 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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы Sinatra
  2. Маршруты и параметры
  3. API JSON
  4. Промежуточное ПО и Rack
← Назад к Ruby Academy