0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Rack - это интерфейс для взаимодействия веб-сервера с HTTP-запросами. У него есть несколько функций:</p>
1
<p>Rack - это интерфейс для взаимодействия веб-сервера с HTTP-запросами. У него есть несколько функций:</p>
2
<ul><li><p>Стандарт интерфейса веб-сервера. Rack определяет, как серверы обрабатывают запросы и взаимодействуют друг с другом. Позволяет использовать различные серверы для запуска приложений</p>
2
<ul><li><p>Стандарт интерфейса веб-сервера. Rack определяет, как серверы обрабатывают запросы и взаимодействуют друг с другом. Позволяет использовать различные серверы для запуска приложений</p>
3
</li>
3
</li>
4
<li><p>Каркас для Middlewares. Rack работает как каркас для middleware, которые обрабатывают запросы по конвейерному принципу.</p>
4
<li><p>Каркас для Middlewares. Rack работает как каркас для middleware, которые обрабатывают запросы по конвейерному принципу.</p>
5
</li>
5
</li>
6
<li><p>Библиотека. Rack содержит вспомогательные функции для более быстрой разработки. Используется в таких фреймворках, как Sinatra и Rails.</p>
6
<li><p>Библиотека. Rack содержит вспомогательные функции для более быстрой разработки. Используется в таких фреймворках, как Sinatra и Rails.</p>
7
</li>
7
</li>
8
</ul><p>Понимание Rack важно для разработки на Sinatra и Rails, поскольку они подчиняются его стандартам.</p>
8
</ul><p>Понимание Rack важно для разработки на Sinatra и Rails, поскольку они подчиняются его стандартам.</p>
9
<h2>Приложение Rack</h2>
9
<h2>Приложение Rack</h2>
10
<p>Чтобы запустить Rack, необходимо импортировать библиотеку, вызвать хендлер и применить метод run(), передавая объект, который содержит метод call(). Приложение запускается командой ruby app.rb</p>
10
<p>Чтобы запустить Rack, необходимо импортировать библиотеку, вызвать хендлер и применить метод run(), передавая объект, который содержит метод call(). Приложение запускается командой ruby app.rb</p>
11
<p>Метод call() должен вернуть массив из трех элементов:</p>
11
<p>Метод call() должен вернуть массив из трех элементов:</p>
12
<ul><li>Статус ответа.</li>
12
<ul><li>Статус ответа.</li>
13
<li>Хедеры в виде хэша.</li>
13
<li>Хедеры в виде хэша.</li>
14
<li>Тело ответа.<a>Тело ответа</a>обычно представляет собой массив строк</li>
14
<li>Тело ответа.<a>Тело ответа</a>обычно представляет собой массив строк</li>
15
</ul><p>Разработчики Rack также создали консольную утилиту под названием<em>rackup</em>. Эта утилита ищет файл с именем<em>config.ru</em>в текущей папке и запускает сервер на порту 9292. Если в<em>config.ru</em>указано приложение, то при отправке GET-запроса на порт 9292 сервер вернет тело ответа, указанное в качестве третьего элемента в конфигурации приложения.</p>
15
</ul><p>Разработчики Rack также создали консольную утилиту под названием<em>rackup</em>. Эта утилита ищет файл с именем<em>config.ru</em>в текущей папке и запускает сервер на порту 9292. Если в<em>config.ru</em>указано приложение, то при отправке GET-запроса на порт 9292 сервер вернет тело ответа, указанное в качестве третьего элемента в конфигурации приложения.</p>
16
<p>Запуск может выполняться одной из команд в зависимости от используемого сервера</p>
16
<p>Запуск может выполняться одной из команд в зависимости от используемого сервера</p>
17
<p>Проверяем работу приложения</p>
17
<p>Проверяем работу приложения</p>
18
<h2>Middlewares</h2>
18
<h2>Middlewares</h2>
19
<p>Middleware - это фильтры запросов, которые обрабатывают информацию о запросе и передают её следующему компоненту.</p>
19
<p>Middleware - это фильтры запросов, которые обрабатывают информацию о запросе и передают её следующему компоненту.</p>
20
<p>Применение middleware:</p>
20
<p>Применение middleware:</p>
21
<ul><li><p>Авторизация</p>
21
<ul><li><p>Авторизация</p>
22
<p>Middleware может управлять доступом, включая встроенные решения для basic-auth</p>
22
<p>Middleware может управлять доступом, включая встроенные решения для basic-auth</p>
23
</li>
23
</li>
24
<li><p>Мониторинг</p>
24
<li><p>Мониторинг</p>
25
<p>Можно отслеживать количество запросов и их время выполнения</p>
25
<p>Можно отслеживать количество запросов и их время выполнения</p>
26
</li>
26
</li>
27
<li><p>Логирование</p>
27
<li><p>Логирование</p>
28
<p>Подходит для записи работы приложения, особенно на уровне системы.</p>
28
<p>Подходит для записи работы приложения, особенно на уровне системы.</p>
29
</li>
29
</li>
30
<li><p>Сериализация</p>
30
<li><p>Сериализация</p>
31
<p>Поддерживает передачу данных, включая динамические переменные.</p>
31
<p>Поддерживает передачу данных, включая динамические переменные.</p>
32
</li>
32
</li>
33
<li><p>Роутинг</p>
33
<li><p>Роутинг</p>
34
<p>Доступ к параметрам запроса позволяет определять, как следует обрабатывать запрос.</p>
34
<p>Доступ к параметрам запроса позволяет определять, как следует обрабатывать запрос.</p>
35
</li>
35
</li>
36
<li><p>Бизнес-логика</p>
36
<li><p>Бизнес-логика</p>
37
<p>Может реализовываться через вызов сервисных объектов в middleware.</p>
37
<p>Может реализовываться через вызов сервисных объектов в middleware.</p>
38
</li>
38
</li>
39
</ul><p>Запрос поступает в приложение и передается через цепочку middleware, каждая из которых обрабатывает определенную логику. Ответ формируется последней middleware.</p>
39
</ul><p>Запрос поступает в приложение и передается через цепочку middleware, каждая из которых обрабатывает определенную логику. Ответ формируется последней middleware.</p>
40
<p>Каждый компонент middleware должен возвращать три элемента: статус, хедеры и тело ответа.</p>
40
<p>Каждый компонент middleware должен возвращать три элемента: статус, хедеры и тело ответа.</p>
41
<p>Ниже пример приложения, содержащее миддлвар</p>
41
<p>Ниже пример приложения, содержащее миддлвар</p>
42
<p>Пример приложения, которое обрабатывает POST запрос:</p>
42
<p>Пример приложения, которое обрабатывает POST запрос:</p>
43
<p>Запуск и выполнение запроса:</p>
43
<p>Запуск и выполнение запроса:</p>
44
<p>Пример Middleware, который обрабатывает предыдущий ответ от приложения и добавляет к телу новую информацию. В этом примере добавляется к телу ответа добавляется текущее время</p>
44
<p>Пример Middleware, который обрабатывает предыдущий ответ от приложения и добавляет к телу новую информацию. В этом примере добавляется к телу ответа добавляется текущее время</p>
45
<p>В этом примере миддлвара Timestamp принимает на вход приложение Rack и перехватывает его ответ. Если статус ответа равен 200 (успешный ответ), миддлвара добавляет к телу ответа текущую дату и время в виде строки.</p>
45
<p>В этом примере миддлвара Timestamp принимает на вход приложение Rack и перехватывает его ответ. Если статус ответа равен 200 (успешный ответ), миддлвара добавляет к телу ответа текущую дату и время в виде строки.</p>
46
<p>Приложение с базовой авторизацией</p>
46
<p>Приложение с базовой авторизацией</p>
47
<p>Запуск и запрос с авторизацией</p>
47
<p>Запуск и запрос с авторизацией</p>
48
<h2>Тестирование Rack-приложений</h2>
48
<h2>Тестирование Rack-приложений</h2>
49
<p>Запуск выполняется командой ruby test.rb</p>
49
<p>Запуск выполняется командой ruby test.rb</p>
50
<h2>Мидлвары Rack</h2>
50
<h2>Мидлвары Rack</h2>
51
<p>Rack предоставляет различные готовые middleware для улучшения функционала, вот некоторые из них:</p>
51
<p>Rack предоставляет различные готовые middleware для улучшения функционала, вот некоторые из них:</p>
52
<p>Сам Rack поставляется со следующим промежуточным программным обеспечением:</p>
52
<p>Сам Rack поставляется со следующим промежуточным программным обеспечением:</p>
53
<ul><li>Rack::Files для раздачи статических файлов.</li>
53
<ul><li>Rack::Files для раздачи статических файлов.</li>
54
<li>Rack::Events для создания удобных хуков при получении запроса и отправке ответа.</li>
54
<li>Rack::Events для создания удобных хуков при получении запроса и отправке ответа.</li>
55
<li>Rack::Head для возврата пустого тела для HEAD-запросов.</li>
55
<li>Rack::Head для возврата пустого тела для HEAD-запросов.</li>
56
<li>Rack::Lock для сериализации запросов с помощью мьютекса.</li>
56
<li>Rack::Lock для сериализации запросов с помощью мьютекса.</li>
57
<li>Rack::Reloader для перезагрузки приложения, если были изменены файлы.</li>
57
<li>Rack::Reloader для перезагрузки приложения, если были изменены файлы.</li>
58
<li>Rack::Runtime для включения в заголовок ответа времени, затраченного на обработку запроса.</li>
58
<li>Rack::Runtime для включения в заголовок ответа времени, затраченного на обработку запроса.</li>
59
<li>Rack::ShowException для перехвата необработанных исключений и представления их в удобном виде.</li>
59
<li>Rack::ShowException для перехвата необработанных исключений и представления их в удобном виде.</li>
60
<li>Rack::MethodOverride для изменения метода запроса на основе переданного параметра.</li>
60
<li>Rack::MethodOverride для изменения метода запроса на основе переданного параметра.</li>
61
</ul><h2>Хелперы Rack</h2>
61
</ul><h2>Хелперы Rack</h2>
62
<p>Rack предоставляет множество хелперов:</p>
62
<p>Rack предоставляет множество хелперов:</p>
63
<ul><li>Rack::Request - обеспечивает разбор строки запроса и работу с несколькими частями.</li>
63
<ul><li>Rack::Request - обеспечивает разбор строки запроса и работу с несколькими частями.</li>
64
<li>Rack::Response - для удобной генерации HTTP-ответов и обработки cookie.</li>
64
<li>Rack::Response - для удобной генерации HTTP-ответов и обработки cookie.</li>
65
<li>Rack::MockRequest и Rack::MockResponse для эффективного и быстрого тестирования Rack-приложений без реальных HTTP-сессий.</li>
65
<li>Rack::MockRequest и Rack::MockResponse для эффективного и быстрого тестирования Rack-приложений без реальных HTTP-сессий.</li>
66
<li>Rack::Directory - для раздачи файлов в директории.</li>
66
<li>Rack::Directory - для раздачи файлов в директории.</li>
67
<li>Rack::MediaType - для разбора заголовков типа содержимого.</li>
67
<li>Rack::MediaType - для разбора заголовков типа содержимого.</li>
68
<li>Rack::Mime - для определения типа содержимого на основе расширения файла.</li>
68
<li>Rack::Mime - для определения типа содержимого на основе расширения файла.</li>
69
</ul><h2>Sinatra</h2>
69
</ul><h2>Sinatra</h2>
70
<p>Sinatra - это легковесный веб-фреймворк, построенный на основе Rack. Он предлагает простой и элегантный способ создания веб-приложений, предоставляя разработчикам возможность быстро разрабатывать RESTful API и небольшие веб-приложения.</p>
70
<p>Sinatra - это легковесный веб-фреймворк, построенный на основе Rack. Он предлагает простой и элегантный способ создания веб-приложений, предоставляя разработчикам возможность быстро разрабатывать RESTful API и небольшие веб-приложения.</p>
71
<p>Sinatra имеет минималистичный синтаксис, что делает его идеальным выбором для небольших проектов и прототипов. Фреймворк позволяет добавлять только необходимые компоненты, что позволяет создавать приложения, максимально соответствующие вашим требованиям. Также он поддерживает использование middleware, что позволяет комбинировать различные библиотеки и улучшать функциональность вашего приложения.</p>
71
<p>Sinatra имеет минималистичный синтаксис, что делает его идеальным выбором для небольших проектов и прототипов. Фреймворк позволяет добавлять только необходимые компоненты, что позволяет создавать приложения, максимально соответствующие вашим требованиям. Также он поддерживает использование middleware, что позволяет комбинировать различные библиотеки и улучшать функциональность вашего приложения.</p>
72
<h3>Пример простого приложения на Sinatra</h3>
72
<h3>Пример простого приложения на Sinatra</h3>
73
<p>Создаем директорию проекта:</p>
73
<p>Создаем директорию проекта:</p>
74
<p>Добавляем зависимости в<em>Gemfile</em>:</p>
74
<p>Добавляем зависимости в<em>Gemfile</em>:</p>
75
<p>Создаем<em>app.rb</em>- точку входа в наше приложение:</p>
75
<p>Создаем<em>app.rb</em>- точку входа в наше приложение:</p>
76
<p>Запускаем:</p>
76
<p>Запускаем:</p>
77
<p>Наше приложение будет доступно по адресу<em><a>http://localhost:4567</a></em>, и на странице будет выведена строка<em>Hello, World!</em></p>
77
<p>Наше приложение будет доступно по адресу<em><a>http://localhost:4567</a></em>, и на странице будет выведена строка<em>Hello, World!</em></p>
78
<h2>Заключение</h2>
78
<h2>Заключение</h2>
79
<p>В этом уроке мы познакомились с основами Rack, его компонентами и концепцией middleware. Мы также рассмотрели Sinatra как легковесный фреймворк, построенный на основе Rack.</p>
79
<p>В этом уроке мы познакомились с основами Rack, его компонентами и концепцией middleware. Мы также рассмотрели Sinatra как легковесный фреймворк, построенный на основе Rack.</p>