Веб-разработка на Go
Теория: Веб-разработка на Go
Все веб-сайты работают по одному и тому же принципу. Всегда есть клиент и сервер, которые взаимодействуют друг с другом:
- Клиент отправляет запрос
- Сервер обрабатывает запрос
- Сервер отправляет ответ клиенту
Такая последовательность называется циклом «запрос-обработка-ответ».
Веб-приложения постоянно обрабатывают запросы и формируют ответы на них. Чтобы упростить эту задачу, можно воспользоваться библиотеками, которые абстрагируют в себе основную работу с запросом и ответом.
Библиотеки упрощают работу над циклом «запрос-обработка-ответ» и освобождают время разработчика для более важных задач. Например, он может сосредоточиться на архитектуре или бизнес-логике своего приложения.
Как во многих других языках, в Golang есть готовые библиотеки для обработки веб-запросов. В этом уроке мы изучим, как реализовать веб-приложение с помощью библиотек.
Реализуем веб-приложение на Go
В этом уроке мы будем использовать пакет стандартной библиотеки net/http. С его помощью можно написать веб-приложение буквально в несколько строк кода:
Пробуем запустить веб-приложение:
Открываем любой браузер и переходим по адресу http://localhost — мы должны получить в ответ строку Hello world!. А теперь разберем этот пример по циклу «запрос-обработка-ответ»:
- Веб-браузер выступает в роли клиента, а Go-приложение — в роли сервера
- Клиент отправляет HTTP-запрос по пути
/ - Сервер читает запрос, обрабатывает его и возвращает строку
Hello world!
Вернемся к примеру и рассмотрим подробнее, что происходит в каждой строчке приложения.
Сначала мы вызывали функцию http.HandleFunc:
Эта функция настраивает обработчик по заданному пути. В нашем примере при любом запросе по пути / всегда будет возвращаться строка Hello world!.
Дальше мы использовали функцию http.ListenAndServe:
В этой части кода запускается веб-приложение на 80 порту и слушает входящие запросы. Все входящие запросы будут обработаны согласно логике, описанной в обработчиках http.HandleFunc.
Вся бизнес-логика приложения находится внутри обработчиков. Попробуем разобраться в их работе и изучим, как они обрабатывают запросы с различными путями и параметрами.
Как сервер сопоставляет пути и обработчики
Когда сервер получает запрос, он смотрит, по какому пути пришел запрос — таким образом он определяет обработчика. Этот процесс сопоставления обработчика по пути называется маршрутизацией или роутингом.
Чтобы использовать роутинг различных запросов на уровне кода Go-приложения, нужно описать обработчиков http.HandleFunc под каждый путь запроса. Рассмотрим, как будет выглядеть код веб-приложения с двумя обработчиками на примере платформы Хекслет:
Запускаем веб-приложение, открываем браузер и проверяем:
- Переходим на страницу http://localhost/ — получаем в ответ строку
Welcome to Hexlet - Переходим на http://localhost/about — получаем строку
Hexlet is the leading educational platform for Software Engineers
Так веб-приложение понимает, по какому пути пришел запрос, и выбирает под него соответствующий обработчик. Мы фокусируемся только на том, что находится внутри обработчиков. При этом реализация роутинга абстрагирована внутри пакета net/http.
Эта реализация обработчиков хорошо работает, когда мы работаем со статичными страницами. Но как быть, если нужно вывести много информации, которая не вмещается на одну страницу?
Как работать с параметрами запросов
Усложним пример с платформой Хекслета. Предположим, что нам надо вывести список курсов на странице/courses, но не более 5 курсов за раз. В этом случае нужно просто разбить список курсов постранично. Такое разбиение данных называется пагинацией (от английского pagination — «разбиение по страницам»).
Самый популярный подход к пагинации — использование параметров запроса. Например, на страницу приходит запрос по пути /courses?page=1 — по параметру page видим, что запрашивается первая страница — возвращаем курсы с 1 по 5.
При получении запроса веб-приложение на net/http считывает всю информацию и заполняет объект r *http.Request.
Теперь попробуем реализовать пагинацию в коде, считав параметры запроса:
Выводы
- Язык Go позволяет "из коробки" реализовать веб-приложение, используя стандартный пакет
net/http - Настройка маршрутизации веб-приложения в Go осуществляется с помощью функции
http.HandleFunc, которая задает функцию-обработчика на каждый путь HTTP-запроса - Вся информация о HTTP-запросе лежит в объекте
r *http.Request - Ответ клиенту формируется с помощью функций объекта
w http.ResponseWriter
