Создание динамической страницы
Цель – отображать полную информацию о статье по её 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-адресов.