编辑:解决了!服务器从/ whales重定向到/ whales /,它将请求转换为GET。我的curl命令有尾部斜杠,但我的表单和Postman请求没有。
我的基本服务器总是将“GET”作为r.Method,即使是来自Postman和html表单的帖子请求也是如此。 r.Form总是一张空地图。
我的代码:
func whaleHandler(w http.ResponseWriter, r *http.Request) {
fmt.Print(r.Method)
fmt.Print(r.Form)
}
func main() {
http.HandleFunc("/whales/", whaleHandler)
log.Fatal(http.ListenAndServe(":9002", nil))
}
这打印:
GETmap[]
我在这里做错了什么?所有人都提前致谢!
编辑:所有内容都与curl一样正常工作,但Postman和常规表单仍然被视为GET请求。
curl -d "Name=Barry" -X POST http://localhost:9002/whales/
结果:
POSTmap[]
,
和r.FormValue("Name")
吐出Barry
样本表格:
<form action="/whales" method="POST">
<div><input type="text" name="Name" placeholder="Name"></div>
<div><input type="text" name="Length" placeholder="Length"></div>
<div><input type="text" name="Type" placeholder="Type"></div>
<div><input type="submit" value="Save"></div>
</form>
来自fmt.Print(r)
的完整输出,格式化了一点以便于阅读:
&{GET
/whales/
HTTP/1.1
1
1
map[
Accept:[
text/html,
application/xhtml+xml,
application/xml;q=0.9,*\/*;q=0.8
]
Accept-Language:[en-US,en;q=0.5]
Accept-Encoding:[gzip, deflate]
Cookie:[io=08-aNjAMs8v6ntatAAAA]
Connection:[keep-alive]
Upgrade-Insecure-Requests:[1]
User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:58.0) Gecko/20100101 Firefox/58.0] Referer:[http://localhost:9002/whales/create]
]
{}
<nil>
0
[]
false
localhost:9002
map[]
map[]
<nil>
map[]
[::1]:61037
/whales/
<nil>
<nil>
<nil>
0xc420162400}
编辑: 样本邮递员请求,导致r.Method =&gt; “得到” Posting with Postman
答案 0 :(得分:2)
您在&#34; / whales /&#34;下注册了您的处理程序,但您的表单操作是&#34; / whales&#34; (没有斜杠)。 Go会将请求从/ whales重定向到/ whales /在此配置中 - 大多数客户选择通过GET请求进行跟踪。
注册&#34; / whales&#34;的处理程序,或将表单操作更改为&#34; / whales /&#34;,具体取决于您希望处理的其他URL。例如,如果你需要处理/ whales / willy,请按原样保留处理程序并更改表单操作。
答案 1 :(得分:0)
您需要调用Request.ParseForm()
(或间接调用它的内容,例如Request.FormValue()
),直到那时Request.Form
不包含表单数据。请参阅可能的重复Getting No data received for go language form。
这在Request.Form
:
// Form contains the parsed form data, including both the URL
// field's query parameters and the POST or PUT form data.
// This field is only available after ParseForm is called.
// The HTTP client ignores Form and uses Body instead.
Form url.Values
如果您将处理程序更改为:
func whaleHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.Method)
fmt.Println(r.Form)
if err := r.ParseForm(); err != nil {
fmt.Println("Error parsing form:", err)
}
fmt.Println(r.Form)
}
执行curl
命令:
curl -d "Name=Barry" -X POST http://localhost:9002/whales/
输出将是:
POST
map[]
map[Name:[Barry]]