Esa tarea es muy fácil con el paquete Golang net / http.
Todo lo que necesitas hacer es:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
asumiendo que los archivos estáticos están en la carpeta nombrada static
en el directorio raíz del proyecto.
Si está en la carpeta static
, tendrá una index.html
llamada de archivo http://localhost:3000/
que dará como resultado la representación de ese archivo de índice en lugar de enumerar todos los archivos disponibles.
Además, llamar a cualquier otro archivo en esa carpeta (por ejemplo http://localhost:3000/clients.html
) mostrará ese archivo, correctamente representado por el navegador (al menos Chrome, Firefox y Safari :))
ACTUALIZACIÓN: entrega de archivos desde una URL diferente a "/"
Si desea servir archivos, diga desde la carpeta ./public
debajo de la URL: localhost:3000/static
debe usar una función adicional : func StripPrefix(prefix string, h Handler) Handler
como esta:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Gracias a eso, todos sus archivos de ./public
están disponibles enlocalhost:3000/static
Sin http.StripPrefix
función, si intenta acceder al archivo localhost:3000/static/test.html
, el servidor lo buscará en./public/static/test.html
Esto se debe a que el servidor trata el URI completo como una ruta relativa al archivo.
Afortunadamente, se resuelve fácilmente con la función incorporada.
/static/
no lo es/static
?/static
como patrón (y strip-prefix),http://example.org/static
el controlador FileServer solo atenderá las solicitudes. Eso significa que las peticiones ahttp://example.org/static/
yhttp://example.org/static/foo.css
etc. fallarían o ser tratado por otro controlador.Prefiero usar
http.ServeFile
para estohttp.FileServer
. Quería deshabilitar la exploración de directorios, un 404 adecuado si faltan archivos y una manera fácil de ubicar el archivo de índice en casos especiales. De esta manera, puede colocar el binario integrado en una carpeta y servirá todo lo relativo a ese binario. Por supuesto, se puede utilizarstrings.Replace
enp
caso de que tenga los archivos almacenados en otro directorio.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) }
fuente
Eso es principalmente lo que describe " Escribir aplicaciones web " y lo que hace un proyecto como hugo (generador de sitios html estáticos).
Se trata de leer un archivo y responder con 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) } }
con
renderFile()
la lectura y establecer el tipo correcto esencialmente:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
fuente
Esto es fácil en golang como:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
'
Puede hacer esto y asegurarse de mantener su archivo HTML como
index.html
fuente