Ruby On Rails
Теория: Rack
Rack – это интерфейс для взаимодействия веб-сервера с HTTP-запросами. У него есть несколько функций:
-
Стандарт интерфейса веб-сервера. Rack определяет, как серверы обрабатывают запросы и взаимодействуют друг с другом. Позволяет использовать различные серверы для запуска приложений
-
Каркас для Middlewares. Rack работает как каркас для middleware, которые обрабатывают запросы по конвейерному принципу.
-
Библиотека. Rack содержит вспомогательные функции для более быстрой разработки. Используется в таких фреймворках, как Sinatra и Rails.
Понимание Rack важно для разработки на Sinatra и Rails, поскольку они подчиняются его стандартам.
Приложение Rack
Чтобы запустить Rack, необходимо импортировать библиотеку, вызвать хендлер и применить метод run(), передавая объект, который содержит метод call(). Приложение запускается командой ruby app.rb
Метод call() должен вернуть массив из трех элементов:
- Статус ответа.
- Хедеры в виде хэша.
- Тело ответа. Тело ответа обычно представляет собой массив строк
Разработчики Rack также создали консольную утилиту под названием rackup. Эта утилита ищет файл с именем config.ru в текущей папке и запускает сервер на порту 9292. Если в config.ru указано приложение, то при отправке GET-запроса на порт 9292 сервер вернет тело ответа, указанное в качестве третьего элемента в конфигурации приложения.
Запуск может выполняться одной из команд в зависимости от используемого сервера
Проверяем работу приложения
Middlewares
Middleware – это фильтры запросов, которые обрабатывают информацию о запросе и передают её следующему компоненту.
Применение middleware:
-
Авторизация
Middleware может управлять доступом, включая встроенные решения для basic-auth
-
Мониторинг
Можно отслеживать количество запросов и их время выполнения
-
Логирование
Подходит для записи работы приложения, особенно на уровне системы.
-
Сериализация
Поддерживает передачу данных, включая динамические переменные.
-
Роутинг
Доступ к параметрам запроса позволяет определять, как следует обрабатывать запрос.
-
Бизнес-логика
Может реализовываться через вызов сервисных объектов в middleware.
Запрос поступает в приложение и передается через цепочку middleware, каждая из которых обрабатывает определенную логику. Ответ формируется последней middleware.
Каждый компонент middleware должен возвращать три элемента: статус, хедеры и тело ответа.
Ниже пример приложения, содержащее миддлвар
Пример приложения, которое обрабатывает POST запрос:
Запуск и выполнение запроса:
Пример Middleware, который обрабатывает предыдущий ответ от приложения и добавляет к телу новую информацию. В этом примере добавляется к телу ответа добавляется текущее время
В этом примере миддлвара Timestamp принимает на вход приложение Rack и перехватывает его ответ. Если статус ответа равен 200 (успешный ответ), миддлвара добавляет к телу ответа текущую дату и время в виде строки.
Приложение с базовой авторизацией
Запуск и запрос с авторизацией
Тестирование Rack-приложений
Запуск выполняется командой ruby test.rb
Мидлвары Rack
Rack предоставляет различные готовые middleware для улучшения функционала, вот некоторые из них:
Сам Rack поставляется со следующим промежуточным программным обеспечением:
Rack::Filesдля раздачи статических файлов.Rack::Eventsдля создания удобных хуков при получении запроса и отправке ответа.Rack::Headдля возврата пустого тела для HEAD-запросов.Rack::Lockдля сериализации запросов с помощью мьютекса.Rack::Reloaderдля перезагрузки приложения, если были изменены файлы.Rack::Runtimeдля включения в заголовок ответа времени, затраченного на обработку запроса.Rack::ShowExceptionдля перехвата необработанных исключений и представления их в удобном виде.Rack::MethodOverrideдля изменения метода запроса на основе переданного параметра.
Хелперы Rack
Rack предоставляет множество хелперов:
Rack::Request- обеспечивает разбор строки запроса и работу с несколькими частями.Rack::Response- для удобной генерации HTTP-ответов и обработки cookie.Rack::MockRequestиRack::MockResponseдля эффективного и быстрого тестирования Rack-приложений без реальных HTTP-сессий.Rack::Directory- для раздачи файлов в директории.Rack::MediaType- для разбора заголовков типа содержимого.Rack::Mime- для определения типа содержимого на основе расширения файла.
Sinatra
Sinatra — это легковесный веб-фреймворк, построенный на основе Rack. Он предлагает простой и элегантный способ создания веб-приложений, предоставляя разработчикам возможность быстро разрабатывать RESTful API и небольшие веб-приложения.
Sinatra имеет минималистичный синтаксис, что делает его идеальным выбором для небольших проектов и прототипов. Фреймворк позволяет добавлять только необходимые компоненты, что позволяет создавать приложения, максимально соответствующие вашим требованиям. Также он поддерживает использование middleware, что позволяет комбинировать различные библиотеки и улучшать функциональность вашего приложения.
Пример простого приложения на Sinatra
Создаем директорию проекта:
Добавляем зависимости в Gemfile:
Создаем app.rb - точку входа в наше приложение:
Запускаем:
Наше приложение будет доступно по адресу http://localhost:4567, и на странице будет выведена строка Hello, World!
Заключение
В этом уроке мы познакомились с основами Rack, его компонентами и концепцией middleware. Мы также рассмотрели Sinatra как легковесный фреймворк, построенный на основе Rack.

