Cette tâche est très simple avec le package Golang net / http.
Tout ce que vous devez faire est:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
en supposant que les fichiers statiques se trouvent dans le dossier nommé static
dans le répertoire racine du projet.
S'il est dans un dossier static
, vous aurez un index.html
appel de fichier http://localhost:3000/
qui entraînera le rendu de ce fichier d'index au lieu de lister tous les fichiers disponibles.
De plus, l'appel de tout autre fichier de ce dossier (par exemple http://localhost:3000/clients.html
) affichera ce fichier, correctement rendu par le navigateur (au moins Chrome, Firefox et Safari :))
MISE À JOUR: diffusion de fichiers à partir d'une URL différente de "/"
Si vous voulez servir des fichiers, dites à partir du dossier ./public
sous l'URL: localhost:3000/static
vous devez utiliser une fonction supplémentaire : func StripPrefix(prefix string, h Handler) Handler
comme ceci:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Grâce à cela, tous vos fichiers ./public
sont disponibles souslocalhost:3000/static
Sans http.StripPrefix
fonction, si vous essayez d'accéder au fichier localhost:3000/static/test.html
, le serveur le recherche dans./public/static/test.html
Cela est dû au fait que le serveur traite l'URI entier comme un chemin relatif vers le fichier.
Heureusement, il est facilement résolu avec la fonction intégrée.
/static/
pas/static
?/static
as pattern (et strip-prefix), seules leshttp://example.org/static
demandes seraient servies par le gestionnaire FileServer. Cela signifie que les demandes àhttp://example.org/static/
ethttp://example.org/static/foo.css
etc. échoueraient ou seraient gérées par un autre gestionnaire.Je préfère utiliser
http.ServeFile
pour celahttp.FileServer
. Je voulais que la navigation dans les répertoires soit désactivée, un 404 approprié si des fichiers manquent et un moyen facile de cas particulier du fichier d'index. De cette façon, vous pouvez simplement déposer le binaire intégré dans un dossier et il servira tout ce qui concerne ce binaire. Bien sûr, vous pouvez utiliserstrings.Replace
surp
si vous avez les fichiers stockés dans un autre répertoire.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) }
la source
C'est principalement ce que décrit « Ecrire des applications Web », et ce que fait un projet comme hugo (générateur de site HTML statique).
Il s'agit de lire un fichier et de répondre avec un 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) } }
avec
renderFile()
essentiellement la lecture et le réglage du bon type:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
la source
C'est facile en Golang car:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
»
Vous pouvez simplement le faire et vous assurer de conserver votre fichier HTML sous
index.html
la source