0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Все веб-сайты работают по одному и тому же принципу. Всегда есть клиент и сервер, которые взаимодействуют друг с другом:</p>
1
<p>Все веб-сайты работают по одному и тому же принципу. Всегда есть клиент и сервер, которые взаимодействуют друг с другом:</p>
2
<ul><li>Клиент отправляет запрос</li>
2
<ul><li>Клиент отправляет запрос</li>
3
<li>Сервер обрабатывает запрос</li>
3
<li>Сервер обрабатывает запрос</li>
4
<li>Сервер отправляет ответ клиенту</li>
4
<li>Сервер отправляет ответ клиенту</li>
5
</ul><p>Такая последовательность называется циклом<strong>"запрос-обработка-ответ"</strong>.</p>
5
</ul><p>Такая последовательность называется циклом<strong>"запрос-обработка-ответ"</strong>.</p>
6
<p>Веб-приложения постоянно обрабатывают запросы и формируют ответы на них. Чтобы упростить эту задачу, можно воспользоваться библиотеками, которые абстрагируют в себе основную работу с запросом и ответом.</p>
6
<p>Веб-приложения постоянно обрабатывают запросы и формируют ответы на них. Чтобы упростить эту задачу, можно воспользоваться библиотеками, которые абстрагируют в себе основную работу с запросом и ответом.</p>
7
<p>Библиотеки упрощают работу над циклом "запрос-обработка-ответ" и освобождают время разработчика для более важных задач. Например, он может сосредоточиться на архитектуре или бизнес-логике своего приложения.</p>
7
<p>Библиотеки упрощают работу над циклом "запрос-обработка-ответ" и освобождают время разработчика для более важных задач. Например, он может сосредоточиться на архитектуре или бизнес-логике своего приложения.</p>
8
<p>Как во многих других языках, в Golang есть готовые библиотеки для обработки веб-запросов. В этом уроке мы изучим, как реализовать веб-приложение с помощью библиотек.</p>
8
<p>Как во многих других языках, в Golang есть готовые библиотеки для обработки веб-запросов. В этом уроке мы изучим, как реализовать веб-приложение с помощью библиотек.</p>
9
<h2>Реализуем веб-приложение на Go</h2>
9
<h2>Реализуем веб-приложение на Go</h2>
10
<p>В этом уроке мы будем использовать пакет стандартной библиотеки net/http. С его помощью можно написать веб-приложение буквально в несколько строк кода:</p>
10
<p>В этом уроке мы будем использовать пакет стандартной библиотеки net/http. С его помощью можно написать веб-приложение буквально в несколько строк кода:</p>
11
<p>Пробуем запустить веб-приложение:</p>
11
<p>Пробуем запустить веб-приложение:</p>
12
<p>Открываем любой браузер и переходим по адресу<em><a>http://localhost</a></em>- мы должны получить в ответ строку Hello world!. А теперь разберем этот пример по циклу "запрос-обработка-ответ":</p>
12
<p>Открываем любой браузер и переходим по адресу<em><a>http://localhost</a></em>- мы должны получить в ответ строку Hello world!. А теперь разберем этот пример по циклу "запрос-обработка-ответ":</p>
13
<ul><li>Веб-браузер выступает в роли клиента, а Go-приложение - в роли сервера</li>
13
<ul><li>Веб-браузер выступает в роли клиента, а Go-приложение - в роли сервера</li>
14
<li>Клиент отправляет HTTP-запрос по пути /</li>
14
<li>Клиент отправляет HTTP-запрос по пути /</li>
15
<li>Сервер читает запрос, обрабатывает его и возвращает строку Hello world!</li>
15
<li>Сервер читает запрос, обрабатывает его и возвращает строку Hello world!</li>
16
</ul><p>Вернемся к примеру и рассмотрим подробнее, что происходит в каждой строчке приложения.</p>
16
</ul><p>Вернемся к примеру и рассмотрим подробнее, что происходит в каждой строчке приложения.</p>
17
<p>Сначала мы вызывали функцию http.HandleFunc:</p>
17
<p>Сначала мы вызывали функцию http.HandleFunc:</p>
18
<p>Эта функция настраивает обработчик по заданному пути. В нашем примере при любом запросе по пути / всегда будет возвращаться строка Hello world!.</p>
18
<p>Эта функция настраивает обработчик по заданному пути. В нашем примере при любом запросе по пути / всегда будет возвращаться строка Hello world!.</p>
19
<p>Дальше мы использовали функцию http.ListenAndServe:</p>
19
<p>Дальше мы использовали функцию http.ListenAndServe:</p>
20
<p>В этой части кода запускается веб-приложение на<strong>80</strong>порту и слушает входящие запросы. Все входящие запросы будут обработаны согласно логике, описанной в обработчиках http.HandleFunc.</p>
20
<p>В этой части кода запускается веб-приложение на<strong>80</strong>порту и слушает входящие запросы. Все входящие запросы будут обработаны согласно логике, описанной в обработчиках http.HandleFunc.</p>
21
<p>Вся бизнес-логика приложения находится внутри<strong>обработчиков</strong>. Попробуем разобраться в их работе и изучим, как они обрабатывают запросы с различными путями и параметрами.</p>
21
<p>Вся бизнес-логика приложения находится внутри<strong>обработчиков</strong>. Попробуем разобраться в их работе и изучим, как они обрабатывают запросы с различными путями и параметрами.</p>
22
<h2>Как сервер сопоставляет пути и обработчики</h2>
22
<h2>Как сервер сопоставляет пути и обработчики</h2>
23
<p>Когда сервер получает запрос, он смотрит, по какому пути пришел запрос - таким образом он определяет обработчика. Этот процесс сопоставления обработчика по пути называется<strong>маршрутизацией</strong>или<strong>роутингом</strong>.</p>
23
<p>Когда сервер получает запрос, он смотрит, по какому пути пришел запрос - таким образом он определяет обработчика. Этот процесс сопоставления обработчика по пути называется<strong>маршрутизацией</strong>или<strong>роутингом</strong>.</p>
24
<p>Чтобы использовать роутинг различных запросов на уровне кода Go-приложения, нужно описать обработчиков http.HandleFunc под каждый путь запроса. Рассмотрим, как будет выглядеть код веб-приложения с двумя обработчиками на примере платформы Хекслет:</p>
24
<p>Чтобы использовать роутинг различных запросов на уровне кода Go-приложения, нужно описать обработчиков http.HandleFunc под каждый путь запроса. Рассмотрим, как будет выглядеть код веб-приложения с двумя обработчиками на примере платформы Хекслет:</p>
25
<p>Запускаем веб-приложение, открываем браузер и проверяем:</p>
25
<p>Запускаем веб-приложение, открываем браузер и проверяем:</p>
26
<ul><li>Переходим на страницу<em><a>http://localhost/</a></em>- получаем в ответ строку Welcome to Hexlet</li>
26
<ul><li>Переходим на страницу<em><a>http://localhost/</a></em>- получаем в ответ строку Welcome to Hexlet</li>
27
<li>Переходим на<em><a>http://localhost/about</a></em>- получаем строку Hexlet is the leading educational platform for Software Engineers</li>
27
<li>Переходим на<em><a>http://localhost/about</a></em>- получаем строку Hexlet is the leading educational platform for Software Engineers</li>
28
</ul><p>Так веб-приложение понимает, по какому пути пришел запрос, и выбирает под него соответствующий обработчик. Мы фокусируемся только на том, что находится внутри обработчиков. При этом реализация роутинга абстрагирована внутри пакета net/http.</p>
28
</ul><p>Так веб-приложение понимает, по какому пути пришел запрос, и выбирает под него соответствующий обработчик. Мы фокусируемся только на том, что находится внутри обработчиков. При этом реализация роутинга абстрагирована внутри пакета net/http.</p>
29
<p>Эта реализация обработчиков хорошо работает, когда мы работаем со статичными страницами. Но как быть, если нужно вывести много информации, которая не вмещается на одну страницу?</p>
29
<p>Эта реализация обработчиков хорошо работает, когда мы работаем со статичными страницами. Но как быть, если нужно вывести много информации, которая не вмещается на одну страницу?</p>
30
<h2>Как работать с параметрами запросов</h2>
30
<h2>Как работать с параметрами запросов</h2>
31
<p>Усложним пример с платформой Хекслета. Предположим, что нам надо вывести список курсов на странице/courses, но не более 5 курсов за раз. В этом случае нужно просто разбить список курсов постранично. Такое разбиение данных называется<strong>пагинацией</strong>(от английского pagination - "разбиение по страницам").</p>
31
<p>Усложним пример с платформой Хекслета. Предположим, что нам надо вывести список курсов на странице/courses, но не более 5 курсов за раз. В этом случае нужно просто разбить список курсов постранично. Такое разбиение данных называется<strong>пагинацией</strong>(от английского pagination - "разбиение по страницам").</p>
32
<p>Самый популярный подход к пагинации - использование параметров запроса. Например, на страницу приходит запрос по пути /courses?page=1 - по параметру<em>page</em>видим, что запрашивается первая страница - возвращаем курсы с 1 по 5.</p>
32
<p>Самый популярный подход к пагинации - использование параметров запроса. Например, на страницу приходит запрос по пути /courses?page=1 - по параметру<em>page</em>видим, что запрашивается первая страница - возвращаем курсы с 1 по 5.</p>
33
<p>При получении запроса веб-приложение на net/http считывает всю информацию и заполняет объект r *http.Request.</p>
33
<p>При получении запроса веб-приложение на net/http считывает всю информацию и заполняет объект r *http.Request.</p>
34
<p>Теперь попробуем реализовать пагинацию в коде, считав параметры запроса:</p>
34
<p>Теперь попробуем реализовать пагинацию в коде, считав параметры запроса:</p>
35
<h2>Выводы</h2>
35
<h2>Выводы</h2>
36
<ul><li>Язык Go позволяет "из коробки" реализовать веб-приложение, используя стандартный пакет net/http</li>
36
<ul><li>Язык Go позволяет "из коробки" реализовать веб-приложение, используя стандартный пакет net/http</li>
37
<li>Настройка маршрутизации веб-приложения в Go осуществляется с помощью функции http.HandleFunc, которая задает функцию-обработчика на каждый путь HTTP-запроса</li>
37
<li>Настройка маршрутизации веб-приложения в Go осуществляется с помощью функции http.HandleFunc, которая задает функцию-обработчика на каждый путь HTTP-запроса</li>
38
<li>Вся информация о HTTP-запросе лежит в объекте r *http.Request</li>
38
<li>Вся информация о HTTP-запросе лежит в объекте r *http.Request</li>
39
<li>Ответ клиенту формируется с помощью функций объекта w http.ResponseWriter</li>
39
<li>Ответ клиенту формируется с помощью функций объекта w http.ResponseWriter</li>
40
</ul>
40
</ul>