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 staticen el directorio raíz del proyecto.
Si está en la carpeta static, tendrá una index.htmlllamada 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 ./publicdebajo de la URL: localhost:3000/staticdebe usar una función adicional : func StripPrefix(prefix string, h Handler) Handlercomo 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 ./publicestán disponibles enlocalhost:3000/static
Sin http.StripPrefixfunció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?/staticcomo patrón (y strip-prefix),http://example.org/staticel controlador FileServer solo atenderá las solicitudes. Eso significa que las peticiones ahttp://example.org/static/yhttp://example.org/static/foo.cssetc. fallarían o ser tratado por otro controlador.Prefiero usar
http.ServeFilepara 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.Replaceenpcaso 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.htmlfuente