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