1. ホーム
  2. go

[解決済み] Go で / に異なるメソッドの http リクエストを処理するにはどうすればよいですか?

2023-03-31 19:30:38

質問

へのリクエストを処理する最良の方法を見つけようとしています。 / へのリクエストと / で、異なるメソッドを異なる方法で処理します。私が思いついたベストはこちらです。

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 は魅力的に見えますが、停滞しているように見えます。

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

どのように解決するのですか?

ルートだけを提供するようにすること。あなたは正しいことを行っています。場合によっては、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)
}

もちろん、gorillaのようなサードパーティ製のパッケージの方がうまくいく場合もあります。