0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Представим, что мы разрабатываем веб-сайт с обучающими курсами, который состоит из нескольких страниц: о компании и со списком курсов. Нам в этом случае нужно так настроить веб-приложение, чтобы оно отображало разные страницы. В этом поможет маршрутизация.</p>
1
<p>Представим, что мы разрабатываем веб-сайт с обучающими курсами, который состоит из нескольких страниц: о компании и со списком курсов. Нам в этом случае нужно так настроить веб-приложение, чтобы оно отображало разные страницы. В этом поможет маршрутизация.</p>
2
<p>В этом уроке мы разберем понятие маршрутизации. В веб-разработке - это важная составляющая, потому что она определяет, как веб-приложение обрабатывает различные HTTP-запросы пользователей.</p>
2
<p>В этом уроке мы разберем понятие маршрутизации. В веб-разработке - это важная составляющая, потому что она определяет, как веб-приложение обрабатывает различные HTTP-запросы пользователей.</p>
3
<h2>Что такое роутинг</h2>
3
<h2>Что такое роутинг</h2>
4
<p>В Go-приложениях вся бизнес-логика описывается в обработчиках. Каждый обработчик - это логика поведения веб-приложения на определенный HTTP-запрос от клиента. Но веб-приложению нужно определить, какой обработчик используется для определенного запроса.</p>
4
<p>В Go-приложениях вся бизнес-логика описывается в обработчиках. Каждый обработчик - это логика поведения веб-приложения на определенный HTTP-запрос от клиента. Но веб-приложению нужно определить, какой обработчик используется для определенного запроса.</p>
5
<p>Когда веб-приложение получает запрос от клиента, оно сопоставляет HTTP-запрос с существующими обработчиками. Процесс определения обработчика по запросу называется<strong>маршрутизацией</strong>или<strong>роутингом</strong>.</p>
5
<p>Когда веб-приложение получает запрос от клиента, оно сопоставляет HTTP-запрос с существующими обработчиками. Процесс определения обработчика по запросу называется<strong>маршрутизацией</strong>или<strong>роутингом</strong>.</p>
6
<p>Чаще всего роутинг осуществляется двумя способами:</p>
6
<p>Чаще всего роутинг осуществляется двумя способами:</p>
7
<ul><li>По пути HTTP-запроса</li>
7
<ul><li>По пути HTTP-запроса</li>
8
<li>По HTTP-методу запроса</li>
8
<li>По HTTP-методу запроса</li>
9
</ul><p>Разберем каждый подход подробнее.</p>
9
</ul><p>Разберем каждый подход подробнее.</p>
10
<h3>Роутинг по пути HTTP-запроса</h3>
10
<h3>Роутинг по пути HTTP-запроса</h3>
11
<p>Роутинг по пути HTTP-запроса используется во всех веб-приложениях. Путь - это часть URL, которая идет после домена. Например, в URL https://example.com/about путь - это /about.</p>
11
<p>Роутинг по пути HTTP-запроса используется во всех веб-приложениях. Путь - это часть URL, которая идет после домена. Например, в URL https://example.com/about путь - это /about.</p>
12
<p>Правила сопоставления пути HTTP-запроса с обработчиком описываются в коде при инициализации веб-приложения:</p>
12
<p>Правила сопоставления пути HTTP-запроса с обработчиком описываются в коде при инициализации веб-приложения:</p>
13
<p>Когда приходит новый запрос от клиента, веб-приложение ищет соответствующий обработчик по пути HTTP-запроса. В примере выше при запросе по пути /path1 будет вызван обработчик path1Handler, а при запросе по пути /path2 будет вызван обработчик path2Handler.</p>
13
<p>Когда приходит новый запрос от клиента, веб-приложение ищет соответствующий обработчик по пути HTTP-запроса. В примере выше при запросе по пути /path1 будет вызван обработчик path1Handler, а при запросе по пути /path2 будет вызван обработчик path2Handler.</p>
14
<p>Мы видим, чтобы в Fiber настроить роутинг на<strong>GET</strong>HTTP-запрос, достаточно вызвать метод webApp.Get() и передать путь HTTP-запроса с нужным обработчиком.</p>
14
<p>Мы видим, чтобы в Fiber настроить роутинг на<strong>GET</strong>HTTP-запрос, достаточно вызвать метод webApp.Get() и передать путь HTTP-запроса с нужным обработчиком.</p>
15
<p>Рассмотрим маршрутизацию по пути HTTP-запроса на конкретном примере. Нам нужно реализовать веб-приложение с обучающими курсами. Оно должно уметь обрабатывать два типа запросов:</p>
15
<p>Рассмотрим маршрутизацию по пути HTTP-запроса на конкретном примере. Нам нужно реализовать веб-приложение с обучающими курсами. Оно должно уметь обрабатывать два типа запросов:</p>
16
<ul><li>Запрос по пути /about должен возвращать текст "The best school for Software Engineers"</li>
16
<ul><li>Запрос по пути /about должен возвращать текст "The best school for Software Engineers"</li>
17
<li>Запрос по пути /courses должен возвращать список курсов. Мы будем возвращать список курсов в виде строки "Java, Go, Python"</li>
17
<li>Запрос по пути /courses должен возвращать список курсов. Мы будем возвращать список курсов в виде строки "Java, Go, Python"</li>
18
</ul><p>Запускаем веб-приложение и переходим в браузере на страницу со списком курсов:<em><a>http://localhost/courses</a></em>. Видим, что в ответ пришло сообщение "Java, Go, Python".</p>
18
</ul><p>Запускаем веб-приложение и переходим в браузере на страницу со списком курсов:<em><a>http://localhost/courses</a></em>. Видим, что в ответ пришло сообщение "Java, Go, Python".</p>
19
<p>Если мы перейдем на страницу с информацией о компании<em><a>http://localhost/about</a></em>- в ответ приходит строка "The best school for Software Engineers".</p>
19
<p>Если мы перейдем на страницу с информацией о компании<em><a>http://localhost/about</a></em>- в ответ приходит строка "The best school for Software Engineers".</p>
20
<p>Веб-приложение понимает, какой обработчик необходимо вызвать по пути HTTP-запросов. Поэтому мы получаем в ответе сообщение, которое соответствует HTTP-запросу. Но что будет, если мы отправим HTTP-запрос по несуществующему пути?</p>
20
<p>Веб-приложение понимает, какой обработчик необходимо вызвать по пути HTTP-запросов. Поэтому мы получаем в ответе сообщение, которое соответствует HTTP-запросу. Но что будет, если мы отправим HTTP-запрос по несуществующему пути?</p>
21
<p>Если отправить запрос по несуществующему пути, например,<em>/about2</em>, то ответ будет таким: "Cannot GET /about2" с HTTP статусом 404 Not Found. Так происходит, потому что мы не настроили обработчик для пути<em>/about2</em>, и веб-приложение не знает, какой обработчик ему вызвать. В таком случае возвращается стандартный ответ с HTTP-статусом 404 Not Found.</p>
21
<p>Если отправить запрос по несуществующему пути, например,<em>/about2</em>, то ответ будет таким: "Cannot GET /about2" с HTTP статусом 404 Not Found. Так происходит, потому что мы не настроили обработчик для пути<em>/about2</em>, и веб-приложение не знает, какой обработчик ему вызвать. В таком случае возвращается стандартный ответ с HTTP-статусом 404 Not Found.</p>
22
<p>Мы разобрали, как настроить роутинг по HTTP-запросам. В нашем примере веб-приложение только возвращало запрашиваемые данные. В иных случаях нам часто требуется не только возвращать данные, но и изменять их. Для этого используется роутинг по методам HTTP-запросов.</p>
22
<p>Мы разобрали, как настроить роутинг по HTTP-запросам. В нашем примере веб-приложение только возвращало запрашиваемые данные. В иных случаях нам часто требуется не только возвращать данные, но и изменять их. Для этого используется роутинг по методам HTTP-запросов.</p>
23
<h3>Роутинг по HTTP-методу запроса</h3>
23
<h3>Роутинг по HTTP-методу запроса</h3>
24
<p>HTTP-метод - это метод, который указывает, какое действие нужно выполнить по HTTP-пути запроса. Мы рассмотрим два наиболее популярных HTTP-метода:</p>
24
<p>HTTP-метод - это метод, который указывает, какое действие нужно выполнить по HTTP-пути запроса. Мы рассмотрим два наиболее популярных HTTP-метода:</p>
25
<ul><li><strong>GET</strong>- получение данных</li>
25
<ul><li><strong>GET</strong>- получение данных</li>
26
<li><strong>POST</strong>- создание или изменение данных</li>
26
<li><strong>POST</strong>- создание или изменение данных</li>
27
</ul><p>В Fiber роутинг по HTTP-методу запроса настраивается с помощью специальных функций:</p>
27
</ul><p>В Fiber роутинг по HTTP-методу запроса настраивается с помощью специальных функций:</p>
28
<ul><li>webApp.Get() - для роутинга GET-запросов</li>
28
<ul><li>webApp.Get() - для роутинга GET-запросов</li>
29
<li>webApp.Post() - для роутинга POST-запросов</li>
29
<li>webApp.Post() - для роутинга POST-запросов</li>
30
</ul><p>Рассмотрим роутинг по HTTP-методам на конкретном примере. Предположим, что мы разрабатываем онлайн-счетчик, который умеет обрабатывать следующие HTTP-запросы:</p>
30
</ul><p>Рассмотрим роутинг по HTTP-методам на конкретном примере. Предположим, что мы разрабатываем онлайн-счетчик, который умеет обрабатывать следующие HTTP-запросы:</p>
31
<ul><li><em>POST /counter</em>, который увеличивает счетчик на единицу</li>
31
<ul><li><em>POST /counter</em>, который увеличивает счетчик на единицу</li>
32
<li><em>GET /counter</em>, который возвращает текущее значение счетчика и не изменяет его состояние</li>
32
<li><em>GET /counter</em>, который возвращает текущее значение счетчика и не изменяет его состояние</li>
33
</ul><p>В этих HTTP-запросах совпадает путь, но различаются методы. И именно по ним веб-приложение понимает, какой обработчик нужно вызывать.</p>
33
</ul><p>В этих HTTP-запросах совпадает путь, но различаются методы. И именно по ним веб-приложение понимает, какой обработчик нужно вызывать.</p>
34
<p>Так это выглядит на Go с использованием фреймворка Fiber:</p>
34
<p>Так это выглядит на Go с использованием фреймворка Fiber:</p>
35
<p>Запускаем веб-приложение, открываем браузер и переходим на страницу<em><a>http://localhost/counter</a></em>. В ответ получаем строку "0". Нам вернулся корректный ответ, потому что мы еще не увеличивали счетчик.</p>
35
<p>Запускаем веб-приложение, открываем браузер и переходим на страницу<em><a>http://localhost/counter</a></em>. В ответ получаем строку "0". Нам вернулся корректный ответ, потому что мы еще не увеличивали счетчик.</p>
36
<p>Счетчик увеличивается с помощью POST-запроса. Есть разные способы осуществить такой запрос, но проще всего использовать утилиту<em>curl</em>. Для этого открываем терминал и выполняем следующую команду:</p>
36
<p>Счетчик увеличивается с помощью POST-запроса. Есть разные способы осуществить такой запрос, но проще всего использовать утилиту<em>curl</em>. Для этого открываем терминал и выполняем следующую команду:</p>
37
<p>В ответ получаем статус "HTTP/1.1 200 OK" - успешное выполнение запроса. Переходим на страницу<em><a>http://localhost/counter</a></em>в браузере и видим, что счетчик увеличился на единицу.</p>
37
<p>В ответ получаем статус "HTTP/1.1 200 OK" - успешное выполнение запроса. Переходим на страницу<em><a>http://localhost/counter</a></em>в браузере и видим, что счетчик увеличился на единицу.</p>
38
<p>Мы можем бесконечно увеличивать счетчик, и в любой момент при переходе на страницу<em><a>http://localhost/counter</a></em>мы получим текущее значение счетчика.</p>
38
<p>Мы можем бесконечно увеличивать счетчик, и в любой момент при переходе на страницу<em><a>http://localhost/counter</a></em>мы получим текущее значение счетчика.</p>
39
<p>Так мы реализовали веб-приложение, которое умеет обрабатывать HTTP-запросы с разными методами, но одинаковыми путями.</p>
39
<p>Так мы реализовали веб-приложение, которое умеет обрабатывать HTTP-запросы с разными методами, но одинаковыми путями.</p>
40
<p>Во всех примерах мы описывали статичные пути, когда запрос точно совпадает с описанным путем обработчика. В некоторых приложениях такого подхода недостаточно из-за дополнительных требований. Разберем, как их можно реализовать.</p>
40
<p>Во всех примерах мы описывали статичные пути, когда запрос точно совпадает с описанным путем обработчика. В некоторых приложениях такого подхода недостаточно из-за дополнительных требований. Разберем, как их можно реализовать.</p>
41
<h2>Что такое динамический роутинг и как его реализовать</h2>
41
<h2>Что такое динамический роутинг и как его реализовать</h2>
42
<p>Представим, что нам необходимо усложнить веб-приложение онлайн-счетчика и добавить возможность работать со счетчиками различных событий. Нам нужно, чтобы у каждого типа события было несколько счетчиков.</p>
42
<p>Представим, что нам необходимо усложнить веб-приложение онлайн-счетчика и добавить возможность работать со счетчиками различных событий. Нам нужно, чтобы у каждого типа события было несколько счетчиков.</p>
43
<p>Чтобы работать с различными счетчиками, добавим возможность указывать название события в пути запроса. Например, для события click будет путь запроса /counter/click, а для события view - путь запроса /counter/view. Событий может быть много, поэтому нам нужно описать их. Для этого используем<strong>динамический роутинг</strong>.</p>
43
<p>Чтобы работать с различными счетчиками, добавим возможность указывать название события в пути запроса. Например, для события click будет путь запроса /counter/click, а для события view - путь запроса /counter/view. Событий может быть много, поэтому нам нужно описать их. Для этого используем<strong>динамический роутинг</strong>.</p>
44
<p>Динамический роутинг позволяет указывать часть пути HTTP-запроса, которая будет изменяться в зависимости от запроса. Например, в нашем случае мы можем указать, что часть пути запроса /counter будет всегда одинаковой. При этом вторая часть пути запроса будет меняться в зависимости от события /counter/:event:</p>
44
<p>Динамический роутинг позволяет указывать часть пути HTTP-запроса, которая будет изменяться в зависимости от запроса. Например, в нашем случае мы можем указать, что часть пути запроса /counter будет всегда одинаковой. При этом вторая часть пути запроса будет меняться в зависимости от события /counter/:event:</p>
45
<p>Запустим приложение и проверим его работу. Для начала увеличим счетчик нескольких событий, а затем проверим, что у них корректное состояние:</p>
45
<p>Запустим приложение и проверим его работу. Для начала увеличим счетчик нескольких событий, а затем проверим, что у них корректное состояние:</p>
46
<ol><li>Отправим POST-запрос на http://localhost/counter/clicks три раза</li>
46
<ol><li>Отправим POST-запрос на http://localhost/counter/clicks три раза</li>
47
<li>Откроем в браузере страницу http://localhost/counter/clicks и проверим, что счетчик события clicks равен трем</li>
47
<li>Откроем в браузере страницу http://localhost/counter/clicks и проверим, что счетчик события clicks равен трем</li>
48
<li>Отправим POST-запрос на http://localhost/counter/views два раза</li>
48
<li>Отправим POST-запрос на http://localhost/counter/views два раза</li>
49
<li>Откроем в браузере страницу http://localhost/counter/views и проверим, что счетчик события views равен двум</li>
49
<li>Откроем в браузере страницу http://localhost/counter/views и проверим, что счетчик события views равен двум</li>
50
</ol><p>Мы увеличили счетчики двух событий:<em>clicks</em>и<em>views</em>. После этого мы получили и проверили значения обоих счетчиков. Благодаря динамическому роутингу мы работали с двумя событиями, при этом использовали одни и те же обработчики. При необходимости мы можем добавлять новые события и не менять код обработчиков.</p>
50
</ol><p>Мы увеличили счетчики двух событий:<em>clicks</em>и<em>views</em>. После этого мы получили и проверили значения обоих счетчиков. Благодаря динамическому роутингу мы работали с двумя событиями, при этом использовали одни и те же обработчики. При необходимости мы можем добавлять новые события и не менять код обработчиков.</p>
51
<h2>Выводы</h2>
51
<h2>Выводы</h2>
52
<p>В этом уроке мы разобрали, что такое роутинг - это процесс сопоставления HTTP-запроса с обработчиком, который будет обрабатывать этот запрос. Еще его называют маршрутизацией. Роутинг осуществляется с помощью путей и методов запроса, а динамический роутинг позволяет обрабатывать запросы с разными путями, и при этом использовать один обработчик.</p>
52
<p>В этом уроке мы разобрали, что такое роутинг - это процесс сопоставления HTTP-запроса с обработчиком, который будет обрабатывать этот запрос. Еще его называют маршрутизацией. Роутинг осуществляется с помощью путей и методов запроса, а динамический роутинг позволяет обрабатывать запросы с разными путями, и при этом использовать один обработчик.</p>