Содержимое веб-приложения или веб-сайта нередко определяется в виде статических html-страниц. Для них не нужен какой-то дополнительный рендеринг на стороне сервера. Для прямой отправки статических файлов в пакете http определена функция FileServer, которая возващает объект Handler:
func FileServer(root FileSystem) Handler
В качестве параметра она принимает путь к каталогу со статическими файлами.
Например, определим в каталоге с исходным файлом на Go папку, которую назовем static. Создадим в ней два статических файла: index.html и about.html.
Определим в файле index.html следующий код:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> <h1>Index</h1> </body> </html>
А в файле about.html следующий код:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>About</title> </head> <body> <h1>About</h1> </body> </html>
В главном файле server.go определим следующий код:
package main import ( "fmt" "net/http" ) func main() { fmt.Println("Server is listening...") http.ListenAndServe(":8181", http.FileServer(http.Dir("static"))) }
В функцию http.FileServer()
передается путь к файлам, который определяется функцией http.Dir()
.
Запустим приложение и обратимся по адресу http://localhost:8181
Путь к корню веб-сайта автоматически сопоставляется с файлом index.html - это все равно, если бы мы обратились по адресу http://localhost:8181/index.html
Также обратимся по адресу http://localhost:8181/about.html. В этом случае мы получим содержимое файла about.html
В то же время такой подход довольно ограничен, так как в данном случае сервер отдает только статические файлы. Однако, как правило, возникает необходимость именно в генерации динамического контента. И в этом случае мы можем поступить следующим образом:
package main import ( "fmt" "net/http" ) func main() { fs := http.FileServer(http.Dir("static")) http.Handle("/", fs) http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w, "About Page") }) http.HandleFunc("/contact", func(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w, "Contact Page") }) fmt.Println("Server is listening...") http.ListenAndServe(":8181", nil) }
В данном случае с помощью функции http.Handle("/", fs)
файловый сервер монтируется к пути "/", то есть к корню сайта. И наряду
с этим мы также можем определять обработчики для других маршрутов. Таким образом, будет работать как динамическая генерация контента, так и статические файлы:
Также для отправки файлов можно использовать функцию http.ServeFile(). Она отправляет единичный файл по определенному пути. Например, используем ранее определенные файлы index.html и about.html:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request){ http.ServeFile(w, r, "static/about.html") }) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){ http.ServeFile(w, r, "static/index.html") }) fmt.Println("Server is listening...") http.ListenAndServe(":8181", nil) }