HTML Diff
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>