4

Go 的默认 HTTP 服务器实现在 HTTP 请求中合并斜线,将 HTTP 重定向响应返回到“清理”路径:

https://code.google.com/p/go/source/browse/src/pkg/net/http/server.go#1420

因此,如果您发出 HTTP 请求GET /http://foo.com/,服务器会以301 Moved Permanently ... Location: /http:/foo.com/.

我想禁用此行为并自己处理所有路径。

我是 Go 新手,似乎我可以创建自己的Server实例并覆盖Handler属性,但我不知道该怎么做?

4

1 回答 1

10

我想禁用此行为并自己处理所有路径。

我是 Go 新手,似乎我可以创建自己的 Server 实例并覆盖 Handler 属性,但我不知道该怎么做?

http.DefaultServeMux而不是通过http.Handleor方法注册处理程序,http.HandleFunc只需调用:

http.ListenAndServe(":8080", MyHandler)

whereMyHandler是实现http.Handler接口的类型的实例。

http.ListenAndServe反过来只是一种速记方法,它执行以下操作:

func ListenAndServe(addr string, handler http.Handler) error {
    server := &http.Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

所以你也可以直接这样做。

在您的处理程序中,您可以按照您的意愿解析/路由 URI:

func (h *MyHandlerType) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    uri := r.URL.Path
    // ...use uri...
}
于 2013-06-03T07:31:21.937 回答