Diese Aufgabe ist mit dem Golang net / http-Paket sehr einfach.
Alles was Sie tun müssen ist:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
Angenommen, statische Dateien befinden sich in einem Ordner static
im Stammverzeichnis des Projekts.
Wenn es sich im Ordner befindet static
, wird eine index.html
Datei http://localhost:3000/
aufgerufen , die dazu führt, dass diese Indexdatei gerendert wird, anstatt alle verfügbaren Dateien aufzulisten.
Wenn Sie beispielsweise eine andere Datei in diesem Ordner aufrufen (z. B. http://localhost:3000/clients.html
), wird diese Datei angezeigt, die vom Browser ordnungsgemäß gerendert wurde (mindestens Chrome, Firefox und Safari :)).
UPDATE: Serving von Dateien mit einer anderen URL als "/"
Wenn Sie Dateien ./public
bereitstellen möchten, sagen Sie aus dem Ordner unter URL: localhost:3000/static
Sie müssen zusätzliche Funktionen verwenden : func StripPrefix(prefix string, h Handler) Handler
wie folgt:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Dank dessen sind alle Ihre Dateien ./public
unter verfügbarlocalhost:3000/static
http.StripPrefix
Wenn Sie ohne Funktion versuchen würden, auf eine Datei zuzugreifen localhost:3000/static/test.html
, würde der Server danach suchen./public/static/test.html
Dies liegt daran, dass der Server den gesamten URI als relativen Pfad zur Datei behandelt.
Glücklicherweise ist es mit der eingebauten Funktion leicht zu lösen.
/static/
nicht/static
?/static
wie Muster (und Streifenpräfix) würden nurhttp://example.org/static
Anforderungen vom FileServer-Handler bedient. Das bedeutet, dass Anfragen anhttp://example.org/static/
undhttp://example.org/static/foo.css
usw. fehlschlagen oder von einem anderen Handler bearbeitet werden.Ich benutze es lieber
http.ServeFile
dafürhttp.FileServer
. Ich wollte, dass das Durchsuchen von Verzeichnissen deaktiviert wird, eine richtige 404, wenn Dateien fehlen, und eine einfache Möglichkeit, die Indexdatei in Sonderfällen zu erstellen. Auf diese Weise können Sie die erstellte Binärdatei einfach in einem Ordner ablegen und alles, was mit dieser Binärdatei zu tun hat, wird bereitgestellt. Natürlich können Siestrings.Replace
on verwenden,p
wenn Sie die Dateien in einem anderen Verzeichnis gespeichert haben.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) }
quelle
Dies ist hauptsächlich das, was " Schreiben von Webanwendungen " beschreibt und was ein Projekt wie hugo (statischer HTML-Site-Generator) tut.
Es geht darum, eine Datei zu lesen und mit einem ContentType "text / html" zu antworten:
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) } }
mit im
renderFile()
Wesentlichen Lesen und Einstellen des richtigen Typs:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
quelle
Dies ist in Golang einfach als:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
`
Sie können dies einfach tun und sicherstellen, dass Ihre HTML-Datei wie folgt bleibt
index.html
quelle