如何处理Go中不同方法的http请求?

时间:2013-03-06 06:54:47

标签: go

我正在尝试找出处理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做的最好的吗?我更喜欢像快递或Sinatra那样做http.HandleGet("/", handler)之类的事情。编写简单的REST服务有一个很好的框架吗? web.go看起来很有吸引力,但似乎停滞不前。

感谢您的建议。

2 个答案:

答案 0 :(得分:71)

确保您只为根服务:您正在做正确的事情。在某些情况下,您可能希望调用http.FileServer对象的ServeHttp方法而不是调用NotFound;这取决于你是否有你想要提供的杂项文件。

以不同方式处理不同的方法:我的许多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:
    // Give an error message.
}

当然,您可能会发现像大猩猩这样的第三方软件包可以更好地为您服务。

答案 1 :(得分:27)

呃,我实际上正准备睡觉,因此快速评论看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库链接)。