0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Каждая HTTP-сессия определяется двумя вещами:</p>
1
<p>Каждая HTTP-сессия определяется двумя вещами:</p>
2
<ul><li>Запросом от клиента (браузера)</li>
2
<ul><li>Запросом от клиента (браузера)</li>
3
<li>Ответом от сервера</li>
3
<li>Ответом от сервера</li>
4
</ul><p>Во фреймворках запрос и ответ обычно представляются двумя объектами - request и response.</p>
4
</ul><p>Во фреймворках запрос и ответ обычно представляются двумя объектами - request и response.</p>
5
<p>Javalin тут пошел немного другим путем и объединил все в объекте ctx, который передается каждому обработчику. Через этот объект можно получить любую информацию из HTTP-запроса или добавить данные в HTTP-ответ. В этом уроке вы узнаете, как работать с объектом ctx и разберетесь, как устроена HTTP-сессия в этом случае.</p>
5
<p>Javalin тут пошел немного другим путем и объединил все в объекте ctx, который передается каждому обработчику. Через этот объект можно получить любую информацию из HTTP-запроса или добавить данные в HTTP-ответ. В этом уроке вы узнаете, как работать с объектом ctx и разберетесь, как устроена HTTP-сессия в этом случае.</p>
6
<h2>Response</h2>
6
<h2>Response</h2>
7
<p>Метод ctx.result() формирует тело ответа:</p>
7
<p>Метод ctx.result() формирует тело ответа:</p>
8
<p>По умолчанию данные отдаются с заголовком<em>Content-Type: text/plain</em>. Даже если мы передадим в ответе HTML, тип контента все равно не поменяется. Дело в том, что Javalin не анализирует, что мы отдаем. Поэтому нам придется поменять тип:</p>
8
<p>По умолчанию данные отдаются с заголовком<em>Content-Type: text/plain</em>. Даже если мы передадим в ответе HTML, тип контента все равно не поменяется. Дело в том, что Javalin не анализирует, что мы отдаем. Поэтому нам придется поменять тип:</p>
9
<p>Если данные нужно отдать в виде JSON, то можно использовать метод ctx.json(). Он формирует JSON и устанавливает<em>Content-Type</em>со значением, равным<em>json</em>:</p>
9
<p>Если данные нужно отдать в виде JSON, то можно использовать метод ctx.json(). Он формирует JSON и устанавливает<em>Content-Type</em>со значением, равным<em>json</em>:</p>
10
<p>Кроме тела ответа, можно еще установить заголовки и поменять код ответа:</p>
10
<p>Кроме тела ответа, можно еще установить заголовки и поменять код ответа:</p>
11
<p>Еще мы можем выполнить редирект:</p>
11
<p>Еще мы можем выполнить редирект:</p>
12
<h2>Request</h2>
12
<h2>Request</h2>
13
<p>Данные запроса можно извлечь множеством методов. Обычно такие вещи смотрят по необходимости, поэтому заучивать их смысла нет. Рассмотрим несколько самых базовых методов:</p>
13
<p>Данные запроса можно извлечь множеством методов. Обычно такие вещи смотрят по необходимости, поэтому заучивать их смысла нет. Рассмотрим несколько самых базовых методов:</p>
14
<h2>Параметры запроса</h2>
14
<h2>Параметры запроса</h2>
15
<p>Параметры запроса не считаются частью маршрута и не влияют на выбор обработчика.</p>
15
<p>Параметры запроса не считаются частью маршрута и не влияют на выбор обработчика.</p>
16
<p>Это связано с тем, что они используются для разных вспомогательных целей - например, параметр page обозначает страницу просматриваемого списка. В такой ситуации обработчик один и тот же, а вот данные - разные. Представим, что у нас есть вот такой код:</p>
16
<p>Это связано с тем, что они используются для разных вспомогательных целей - например, параметр page обозначает страницу просматриваемого списка. В такой ситуации обработчик один и тот же, а вот данные - разные. Представим, что у нас есть вот такой код:</p>
17
<p>А теперь посмотрим, что он выводит в лог в ответ на разные запросы из браузера:</p>
17
<p>А теперь посмотрим, что он выводит в лог в ответ на разные запросы из браузера:</p>
18
<p>Во всех этих случаях фреймворк вызовет один и тот же обработчик, связанный с маршрутом<em>/users</em>. Фреймворк автоматически разбирает эти параметры и дает к ним удобный доступ через методы контекста:</p>
18
<p>Во всех этих случаях фреймворк вызовет один и тот же обработчик, связанный с маршрутом<em>/users</em>. Фреймворк автоматически разбирает эти параметры и дает к ним удобный доступ через методы контекста:</p>
19
<p>Параметры запроса не связаны с методом HTTP. Они могут приходить как на GET-запросы, так и на все остальные:</p>
19
<p>Параметры запроса не связаны с методом HTTP. Они могут приходить как на GET-запросы, так и на все остальные:</p>
20
<h2>Автоматическая конвертация</h2>
20
<h2>Автоматическая конвертация</h2>
21
<p>В примере ниже вы видите переменную page типа строка:</p>
21
<p>В примере ниже вы видите переменную page типа строка:</p>
22
<p>С точки зрения HTTP, все переданные через него данные - это строки. Но с точки зрения внутренней логики все работает по-другому. На самом деле, параметры, которые мы передаем через HTTP-протокол, в большинстве случаев строками не являются.</p>
22
<p>С точки зрения HTTP, все переданные через него данные - это строки. Но с точки зрения внутренней логики все работает по-другому. На самом деле, параметры, которые мы передаем через HTTP-протокол, в большинстве случаев строками не являются.</p>
23
<p>Поэтому их нужно преобразовывать в строки. Для удобства работы Javalin предоставляет механизм для автоматической конвертации в нужный тип данных:</p>
23
<p>Поэтому их нужно преобразовывать в строки. Для удобства работы Javalin предоставляет механизм для автоматической конвертации в нужный тип данных:</p>
24
<p>Но даже этого бывает мало. Для примера представим, что страница не установлена. В таком случае мы должны задать значение по умолчанию, равное единице. Javalin позволяет это сделать:</p>
24
<p>Но даже этого бывает мало. Для примера представим, что страница не установлена. В таком случае мы должны задать значение по умолчанию, равное единице. Javalin позволяет это сделать:</p>
25
25