Обработка несуществующих страниц
Что если вы посетите /view/APageThatDoesntExist
? Вы увидите страницу, содержащую HTML. Это потому, что он игнорирует возвращаемое значение ошибки из loadPage
и продолжает пытаться заполнить шаблон без данных. Вместо этого, если запрошенная страница не существует, она должна перенаправлять клиента на страницу редактирования, чтобы создать контент:
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, err := loadPage(title)
if err != nil {
http.Redirect(w, r, "/edit/"+title,
http.StatusFound)
return
}
renderTemplate(w, "view", p)
}
Функция http.Redirect
добавляет код статуса HTTP http.StatusFound
(302) и Location
заголовок к HTTP ответу.
Сохранение страниц
Функция saveHandler
будет обрабатывать отправку форм, которые находятся на страницах редактирования. После раскомментирования соответствующей строки в main
, давайте реализуем обработчик:
func saveHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/save/"):]
body := r.FormValue("body")
p := &Page{Title: title, Body: []byte(body)}
p.save()
http.Redirect(w, r, "/view/"+title, http.StatusFound)
}
Заголовок страницы (указан в URL) и единственное поле формы, Body
хранятся на новой Page
. Затем вызывается метод save()
для записи данных в файл, и клиент перенаправляется на страницу /view/
.
Значение, возвращаемое FormValue
, имеет тип string
. Мы должны преобразовать это значение в []byte
, прежде чем оно уместится в структуре Page
. Мы используем []byte(body)
для выполнения преобразования.
Читайте также:
- Веб-приложение на Go: введение
- Веб-приложение на Go: структуры данных, сохранение и загрузка страницы
- Веб-приложение на Go: введение в пакет net/http, пример веб-сервера на Go
- Веб-приложение на Go: использование net/http для обслуживания вики-страниц
- Веб-приложение на Go: редактирование страниц, пакет html/template
Комментариев нет:
Отправить комментарий