Чтобы использовать пакет net/http
, его необходимо импортировать:
import (
"fmt"
"io/ioutil"
"net/http"
)
Давайте создадим обработчик viewHandler
, который позволит пользователям просмотреть страницу вики. Он будет обрабатывать URL с префиксом "/view/".
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, _ := loadPage(title)
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>",
p.Title, p.Body)
}
Опять же, обратите внимание на использование _
для игнорирования error
, при возвращении значения из loadPage
. Это сделано здесь для простоты и вообще считается плохой практикой. Мы займемся этим позже.
Во-первых, эта функция извлекает заголовок страницы из r.URL.Path
, компонента пути URL запроса. Path
повторно разрезается с помощью [len("/view/"):]
для удаления ведущего компонента "/view/"
пути запроса. Это связано с тем, что путь всегда начинается с "/view/"
, который не является частью заголовка страницы.
Затем функция загружает данные страницы, форматирует страницу со строкой простого HTML и записывает его в w
, http.ResponseWriter
.
Чтобы использовать этот обработчик, мы переписываем нашу функцию main
, чтобы инициализировать http
, используя viewHandler
для обработки любых запросов по пути /view/
.
func main() {
http.HandleFunc("/view/", viewHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Взглянем на весь код веб-приложения, который мы уже написали.
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
type Page struct {
Title string
Body []byte
}
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, _ := loadPage(title)
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>",
p.Title, p.Body)
}
func main() {
http.HandleFunc("/view/", viewHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Давайте создадим некоторые данные страницы (как test.txt
), скомпилируем наш код и попробуем открыть страницу вики.
Откройте файл test.txt
в своем редакторе и сохраните строку "Hello world" (без кавычек) в нем.
$ go build wiki.go
$ ./wiki
(Если вы используете Windows, вы должны ввести wiki
без ./
для запуска программы.)
При работающем веб-сервере при обращении к http://localhost:8080/view/test
должна отобразиться страница с названием «test», содержащая слова «Hello world».
Читайте также:
- Веб-приложение на Go: введение
- Веб-приложение на Go: структуры данных, сохранение и загрузка страницы
- Веб-приложение на Go: введение в пакет net/http, пример веб-сервера на Go
- Веб-приложение на Go: редактирование страниц, пакет html/template
Комментариев нет:
Отправить комментарий