To zadanie jest bardzo łatwe z pakietem Golang net / http.
Wszystko, co musisz zrobić, to:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
zakładając, że pliki statyczne znajdują się w folderze o nazwie static
w katalogu głównym projektu.
Jeśli jest w folderze static
, będziesz mieć index.html
wywołanie pliku, http://localhost:3000/
co spowoduje renderowanie tego pliku indeksu zamiast wyświetlania wszystkich dostępnych plików.
Dodatkowo wywołanie dowolnego innego pliku w tym folderze (na przykład http://localhost:3000/clients.html
) pokaże ten plik, poprawnie wyrenderowany przez przeglądarkę (przynajmniej Chrome, Firefox i Safari :))
UPDATE: wyświetlanie plików z adresu URL innego niż „/”
Jeśli chcesz udostępniać pliki, powiedz z folderu ./public
pod adresem URL: localhost:3000/static
Musisz użyć dodatkowej funkcji : na func StripPrefix(prefix string, h Handler) Handler
przykład:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Dzięki temu wszystkie Twoje pliki ./public
są dostępne podlocalhost:3000/static
Bez http.StripPrefix
funkcji, gdybyś próbował uzyskać dostęp do pliku localhost:3000/static/test.html
, serwer szukałby go w./public/static/test.html
Dzieje się tak, ponieważ serwer traktuje cały identyfikator URI jako ścieżkę względną do pliku.
Na szczęście jest to łatwe do rozwiązania dzięki wbudowanej funkcji.
/static/
nie jest/static
?/static
wzorca (i prefiksu strip) tylkohttp://example.org/static
żądania byłyby obsługiwane przez program obsługi FileServer. Oznacza to, że wnioski dohttp://example.org/static/
ihttp://example.org/static/foo.css
itp zawiedzie lub być obsługiwane przez innego przewodnika.Wolę używać
http.ServeFile
do tego ponadhttp.FileServer
. Chciałem wyłączyć przeglądanie katalogów, poprawny 404 jeśli brakuje plików i łatwy sposób na specjalne oznaczenie pliku indeksu. W ten sposób możesz po prostu upuścić wbudowany plik binarny do folderu i będzie on obsługiwał wszystko względem tego pliku binarnego. Oczywiście możesz użyćstrings.Replace
on,p
jeśli masz pliki zapisane w innym katalogu.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) }
źródło
To jest głównie to, co opisuje „ Pisanie aplikacji internetowych ” i co robi projekt taki jak hugo (statyczny generator witryn HTML).
Chodzi o czytanie pliku i odpowiadanie za pomocą 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) } }
z
renderFile()
zasadniczo czytaniem i ustawieniem odpowiedniego typu:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
źródło
W Golang jest to łatwe, ponieważ:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
`
Możesz to zrobić i upewnić się, że plik HTML jest w formacie
index.html
źródło