我正在使用Go的http包创建一个简单的Web服务器。我只注册了一个处理程序,用于请求路径" / requests /"。
它可以正常处理GET请求,但是当我发送POST请求时,永远不会调用处理程序,并且客户端会获得301 Moved Permanently响应。
我已经尝试过搜索这个但是看起来这并不是人们普遍面临的问题。
我的处理程序是:
func requestHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello")
}
主要功能:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/requests/", requestHandler)
http.ListenAndServe(":8000", mux)
}
Curl给出以下输出:
>> curl -i -X POST http://localhost:8000/requests
HTTP/1.1 301 Moved Permanently
Location: /requests/
Date: Thu, 12 Jan 2017 08:51:10 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Go自己的http客户端返回一个类似的响应对象:
&{301 Moved Permanently 301 HTTP/1.1 1 1 map[Content-Type:[text/plain; charset=utf-8] Location:[/requests/] Date:[Thu, 12 Jan 2017 08:51:58 GMT] Content-Length:[0]] 0x339190 0 [] false false map[] 0xc4200cc0f0 <nil>}
同样,GET请求的行为就像我期望它们并调用处理函数一样。我是否需要以不同的方式处理POST请求?感谢您的帮助!
答案 0 :(得分:3)
您正在查询/requests/
。
重定向指向curl localhost:8000/requests
你像这样使用curl:
/requests
您需要在/requests/
中使用mux.HandleFunc
代替curl localhost:8000/requests/
。
或使用
requestHandler
另请注意,如果您请求可以在浏览器上运行而不进行任何更改,因为它会自动处理重定向。
如果mux.HandleFunc中的路由没有尾部斜杠,则带尾部斜杠的路径将返回404。
PS:您的POST
处理所有方法,而不仅仅是r.Method
个请求。您需要检查{{1}}以不同方式处理这些方法。