Эта задача очень проста с пакетом Golang net / http.
Все, что вам нужно сделать, это:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
предполагая, что статические файлы находятся в папке с именем static
в корневом каталоге проекта.
Если он находится в папке static
, у вас будет index.html
вызов файла, http://localhost:3000/
который приведет к визуализации этого индексного файла вместо перечисления всех доступных файлов.
Кроме того, вызов любого другого файла в этой папке (например http://localhost:3000/clients.html
) покажет этот файл, правильно отображаемый браузером (по крайней мере, Chrome, Firefox и Safari :))
ОБНОВЛЕНИЕ: обслуживание файлов с URL, отличного от "/"
Если вы хотите обслуживать файлы, скажем, из папки ./public
по URL-адресу: localhost:3000/static
вам необходимо использовать дополнительную функцию : func StripPrefix(prefix string, h Handler) Handler
например:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Благодаря этому все ваши файлы ./public
доступны вlocalhost:3000/static
Без http.StripPrefix
функции, если вы попытаетесь получить доступ к файлу localhost:3000/static/test.html
, сервер будет искать его в./public/static/test.html
Это связано с тем, что сервер рассматривает весь URI как относительный путь к файлу.
К счастью, это легко решается встроенной функцией.
/static/
нет/static
?/static
же шаблоном (и полосой префикса)http://example.org/static
обработчик FileServer будет обслуживать только запросы. Это означает, что запросы кhttp://example.org/static/
иhttp://example.org/static/foo.css
т. Д. Не будут выполняться или будут обработаны другим обработчиком.Я предпочитаю использовать
http.ServeFile
для этогоhttp.FileServer
. Я хотел отключить просмотр каталогов, правильный 404, если файлы отсутствуют, и простой способ особого случая индексного файла. Таким образом, вы можете просто перетащить встроенный двоичный файл в папку, и он будет обслуживать все, что связано с этим двоичным файлом. Конечно, вы можете использоватьstrings.Replace
on,p
если у вас есть файлы, хранящиеся в другом каталоге.func main() { fmt.Println("Now Listening on 80") http.HandleFunc("/", serveFiles) log.Fatal(http.ListenAndServe(":80", nil)) } func serveFiles(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL.Path) p := "." + r.URL.Path if p == "./" { p = "./static/index.html" } http.ServeFile(w, r, p) }
источник
Это в основном то, что описывает « Написание веб-приложений » и что делает такой проект, как hugo (генератор статических сайтов HTML).
Речь идет о чтении файла и ответе с помощью ContentType «text / html»:
func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := server.renderFile(w, r.URL.Path) if err != nil { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(http.StatusNotFound) server.fn404(w, r) } }
по
renderFile()
существу читая и устанавливая правильный тип:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
источник
В голанге это просто:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
`
Вы можете просто сделать это и сохранить свой HTML-файл как
index.html
источник