90

/Goでのみリクエストを処理/し、さまざまな方法でさまざまなメソッドを処理するための最良の方法を見つけようとしています。これが私が思いついた最高のものです:

package main

import (
    "fmt"
    "html"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/" {
            http.NotFound(w, r)
            return
        }

        if r.Method == "GET" {
            fmt.Fprintf(w, "GET, %q", html.EscapeString(r.URL.Path))
        } else if r.Method == "POST" {
            fmt.Fprintf(w, "POST, %q", html.EscapeString(r.URL.Path))
        } else {
            http.Error(w, "Invalid request method.", 405)
        }
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

これは慣用的なGoですか?これは、標準のhttp libで実行できる最善の方法ですか?http.HandleGet("/", handler)エクスプレスやシナトラのようなことをしたいです。単純なRESTサービスを作成するための優れたフレームワークはありますか?web.goは魅力的に見えますが、停滞しているように見えます。

アドバイスありがとうございます。

4

2 に答える 2

115

ルートのみにサービスを提供するために:あなたは正しいことをしています。NotFoundを呼び出す代わりに、http.FileServerオブジェクトのServeHttpメソッドを呼び出したい場合があります。それはあなたが同様に提供したい雑多なファイルを持っているかどうかに依存します。

さまざまなメソッドを異なる方法で処理するには:私のHTTPハンドラーの多くには、次のようなswitchステートメントしか含まれていません。

switch r.Method {
case http.MethodGet:
    // Serve the resource.
case http.MethodPost:
    // Create a new record.
case http.MethodPut:
    // Update an existing record.
case http.MethodDelete:
    // Remove the record.
default:
    http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}

もちろん、ゴリラのようなサードパーティのパッケージの方が適している場合があります。

于 2013-03-06T16:57:55.857 に答える
40

ええと、私は実際にベッドに向かっていたので、 http://www.gorillatoolkit.org/pkg/muxを見て簡単なコメントがあります。これは本当に素晴らしく、あなたが望むことをします。ドキュメントを見てください。例えば

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

r.HandleFunc("/products", ProductsHandler).
    Host("www.domain.com").
    Methods("GET").
    Schemes("http")

および上記の操作を実行するための他の多くの可能性と方法。

しかし、私は質問の他の部分、「これは私ができる最善のことですか」に取り組む必要を感じました。std libが少し裸すぎる場合は、https ://github.com/golang/go/wiki/Projects#web-libraries (特にWebライブラリにリンクされている)をチェックするのに最適なリソースがあります。

于 2013-03-06T07:51:49.650 に答える