Golang веб-сайт: динамические страницы с Gorilla Mux

Создание динамической страницы

Цель – отображать полную информацию о статье по её ID. На текущий момент есть две статьи с кнопками «Читать далее», ведущими на URL вида /post/[id], где [id] – идентификатор записи. Сейчас по этим ссылкам отображается шаблон главной страницы. Задача – получать ID из URL, искать по нему статью и отображать её информацию.

Использование библиотеки Gorilla Mux

Для работы со сложными URL-адресами, отличными от статических /contact или /about, необходима библиотека gorilla/mux. Она позволяет легко обрабатывать различные URL-адреса и их динамические параметры.

Установка и подключение библиотеки

Установите библиотеку с помощью команды (команда приведена в видеоуроке). Подключите её в импорте:

import (
t"net/http"
t"github.com/gorilla/mux"
)

Обработка URL-адресов

Создадим объект маршрутизатора:

rtr := mux.NewRouter()

Используем методы объекта rtr для обработки URL-адресов, указывая метод HTTP-запроса (GET, POST и др.):

rtr.HandleFunc("/", homePageHandler).Methods("GET")
rtr.HandleFunc("/contact", contactPageHandler).Methods("GET")
rtr.HandleFunc("/save", savePostHandler).Methods("POST")

Для главной и контактной страниц используется метод GET. Для /save используется POST, так как данные отправляются через форму. Обработка всех URL-адресов осуществляется через gorilla/mux:

http.Handle("/", rtr)
http.ListenAndServe(":8080", nil)

Обработка динамического параметра ID

Добавим обработку URL /post/[id]:

rtr.HandleFunc("/post/{id:[0-9]+}", showPostHandler).Methods("GET")

Шаблон {id:[0-9]+} означает, что после /post/ ожидается один или более цифр. Функция showPostHandler будет обрабатывать этот URL.

Функция showPostHandler и вывод данных

Функция showPostHandler получает параметры URL через mux.Vars(r). id – строка, содержащая ID статьи:

func showPostHandler(w http.ResponseWriter, r *http.Request) {
tvars := mux.Vars(r)
tid := vars["id"]
tfmt.Println(id) // Для отладки

t// ... дальнейшая обработка ...
}

Далее, id используется в SQL-запросе:

db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")
// ... проверка ошибок ...
rows, err := db.Query("SELECT * FROM posts WHERE id = ?", id)
// ... проверка ошибок и обработка результата ...

// создание объекта статьи
showPost := Article{}
// ... получение данных из базы данных и заполнение showPost ...
// передача в шаблон
tmpl.ExecuteTemplate(w, "show", showPost)

Шаблон show.html:

<h1>{{.Title}}</h1>
<p>{{.Body}}</p>
<a href="/">Назад</a>

Создана динамическая страница, отображающая информацию о статьях на основе параметра ID из URL. Библиотека gorilla/mux упростила обработку динамических URL-адресов.

Что будем искать? Например,программа