Как вы обслуживаете статический html-файл с помощью веб-сервера go?


Как вы служите индекса.html (или какой-либо другой статический HTML-файл) с помощью веб-сервера go?

Мне просто нужен базовый статический HTML-файл (например, статья), который я могу обслуживать с веб-сервера go. HTML должен быть модифицируемым вне программы go, как это было бы в случае использования шаблонов HTML.

Это мой веб-сервер, на котором размещается только жестко закодированный текст ("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)
}
2 52

2 ответа:

эта задача очень проста с пакетом Golang net/http.

все, что вам нужно сделать, это:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir("./static")))
        http.ListenAndServe(":3000", nil)
}

предполагая, что статические файлы находятся в папке с именем static в корневом каталоге проекта.

если это в папке static, вы вызов http://localhost:3000/ что приведет к визуализации этого индексного файла вместо перечисления всех доступных файлов.

кроме того, вызов любого другого файла в этой папке (например http://localhost:3000/clients.html) покажет этот файл, правильно отображаемый браузером (по крайней мере Chrome, Firefox и Safari :))

обновление: обслуживание файлов с url-адреса, отличного от "/"

если вы хотите обслуживать файлы, скажем, из папки ./public под url:localhost:3000/static вы должны используйте дополнительную функцию:func StripPrefix(prefix string, h Handler) Handler такой:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
        http.ListenAndServe(":3000", nil)
}

благодаря этому, все ваши файлы ./public доступны в разделе localhost:3000/static

без

не FTP-сервер: это что-то другое, чем то, что я намеревался, что бы служить index.html Домашняя страница, как обычный веб-сервер. Например, когда я иду в mydomain.com в моем браузере, я хочу index.html вынесено.

это в основном то, что "Написание Веб-Приложений " описывает, а какой проект нравится угу (статический генератор html сайта) делает.

речь идет о чтении файл, и ответ с 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)
    }
}

С renderFile() по сути, чтение и установка правильного типа:

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