web-dev-qa-db-ja.com

Go Webサーバーを使用して静的HTMLファイルを提供するにはどうすればよいですか?

Go Webサーバーを使用してindex.html(またはその他の静的HTMLファイル)を提供するにはどうすればよいですか?

Go Webサーバーから提供できる基本的な静的HTMLファイル(たとえば、記事など)が必要です。 HTMLは、HTMLテンプレートを使用している場合のように、goプログラムの外部で変更可能である必要があります。

これはハードコードされたテキスト(「Hello world!」)のみをホストする私のWebサーバーです。

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

このタスクは、Golang net/httpパッケージを使用すると非常に簡単です。

あなたがする必要があるのは:

package main

import (
        "net/http"
)

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

静的ファイルがプロジェクトのルートディレクトリのstaticという名前のフォルダーにあると仮定します。

フォルダーがstaticにある場合、index.htmlファイルが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の下で利用可能です

http.StripPrefix関数がない場合、ファイルlocalhost:3000/static/test.htmlにアクセスしようとすると、サーバーは./public/static/test.htmlでそのファイルを探します。

これは、サーバーがURI全体をファイルへの相対パスとして扱うためです。

幸いなことに、組み込み関数で簡単に解決できます。

115
Jarema

FTPサーバーではない:これは、通常のWebサーバーが行うように、index.htmlホームページを提供することを意図したものとは異なるものです。たとえば、ブラウザでmydomain.comにアクセスすると、index.htmlがレンダリングされます。

それは主に「 Writing Web Applications 」が説明するものであり、プロジェクトが hugo (静的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))
 }
4
VonC