web-dev-qa-db-fra.com

Comment servir un fichier HTML statique à l'aide d'un serveur Web go?

Comment servez-vous index.html (ou un autre fichier HTML statique) à l'aide d'un serveur Web go?

Je veux juste un fichier HTML statique de base (comme un article, par exemple) que je peux servir à partir d'un serveur Web virtuel. Le code HTML doit être modifiable en dehors du programme go, comme ce serait le cas lors de l'utilisation de modèles HTML.

Ceci est mon serveur web qui héberge uniquement du texte codé en dur ("Hello world!").

package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello world!")
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":3000", nil)
}
62
nairware

Cette tâche est très facile avec le package Golang net/http.

Tout ce que vous devez faire c'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.

Si c'est dans le dossier static, vous aurez le fichier index.html Appelant http://localhost:3000/, Ce qui rendra 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) Le montrera, rendu correctement par le navigateur (au moins Chrome, Firefox et Safari :))

UPDATE: servir des fichiers à partir d'une URL différente de "/"

Si vous voulez servir des fichiers, dites à partir du dossier ./public Sous url: localhost:3000/static Vous devez tiliser 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 de ./public Sont disponibles sous localhost:3000/static

Sans la fonction http.StripPrefix, Si vous tentiez d'accéder au fichier localhost:3000/static/test.html, Le serveur le rechercherait dans ./public/static/test.html

Cela est dû au fait que le serveur traite l'URI entier comme un chemin d'accès relatif au fichier.

Heureusement, il est facile à résoudre avec la fonction intégrée.

115
Jarema

PAS un serveur FTP: C'est quelque chose de différent de ce que je voulais, qui serait de servir la page d'accueil index.html, Comme le ferait un serveur Web normal. Par exemple, lorsque je vais sur mydomain.com dans mon navigateur, je veux un rendu index.html.

C’est principalement ce que décrit " Écrire des applications Web ", et à quoi ressemble un projet hugo (générateur de site HTML statique) le fait.

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 lire et définir le bon type:

 file, err = ioutil.ReadFile(server.MediaPath + filename)
 if ext != "" {
    w.Header().Set("Content-Type", mime.TypeByExtension(ext))
 }
4
VonC