请求提交表单时,request.Post数组为空。

huangapple go评论201阅读模式
英文:

request.Post array empty upon form submission

问题

我正在尝试在Go中处理一个简单的HTML表单。然而,我无法在提交后获取任何POST数据。r.Form映射始终为空。不知道我做错了什么。

提前感谢。

以下是代码:http://play.golang.org/p/aZxPCcRAVV

  1. package main
  2. import (
  3. "html/template"
  4. "log"
  5. "net/http"
  6. )
  7. func rootHandler(w http.ResponseWriter, r *http.Request) {
  8. t, _ := template.New("form.html").Parse(form)
  9. t.Execute(w, "")
  10. }
  11. func formHandler(w http.ResponseWriter, r *http.Request) {
  12. log.Println(r.Form)
  13. rootHandler(w, r)
  14. }
  15. func main() {
  16. http.HandleFunc("/", rootHandler)
  17. http.HandleFunc("/login", formHandler)
  18. http.ListenAndServe("127.0.0.1:9999", nil)
  19. }
  20. var form = `
  21. <h1>Login</h1>
  22. <form action="/login" method="POST">
  23. <div><input name="username" type="text"></div>
  24. <div><input type="submit" value="Save"></div>
  25. </form>
  26. `
英文:

I am trying to process a simple html form in go. However, I am unable to get any post data upon submission. The r.Form map is always []. Don't know where I am going wrong.

Thanks in advance.

Here is the code http://play.golang.org/p/aZxPCcRAVV

  1. package main
  2. import (
  3. &quot;html/template&quot;
  4. &quot;log&quot;
  5. &quot;net/http&quot;
  6. )
  7. func rootHandler(w http.ResponseWriter, r *http.Request) {
  8. t, _ := template.New(&quot;form.html&quot;).Parse(form)
  9. t.Execute(w, &quot;&quot;)
  10. }
  11. func formHandler(w http.ResponseWriter, r *http.Request) {
  12. log.Println(r.Form)
  13. rootHandler(w, r)
  14. }
  15. func main() {
  16. http.HandleFunc(&quot;/&quot;, rootHandler)
  17. http.HandleFunc(&quot;/login&quot;, formHandler)
  18. http.ListenAndServe(&quot;127.0.0.1:9999&quot;, nil)
  19. }
  20. var form = `
  21. &lt;h1&gt;Login&lt;/h1&gt;
  22. &lt;form action=&quot;/login&quot; method=&quot;POST&quot;&gt;
  23. &lt;div&gt;&lt;input name=&quot;username&quot; type=&quot;text&quot;&gt;&lt;/div&gt;
  24. &lt;div&gt;&lt;input type=&quot;submit&quot; value=&quot;Save&quot;&gt;&lt;/div&gt;
  25. &lt;/form&gt;
  26. `

答案1

得分: 17

看起来你需要先调用ParseForm。来自go文档

  1. // Form包含解析的表单数据,包括URL字段的查询参数和POST或PUT表单数据。
  2. // 只有在调用ParseForm之后才能使用此字段。
  3. // HTTP客户端忽略Form并使用Body代替。
  4. Form url.Values

以下是一些使你的示例工作的代码。

  1. func formHandler(w http.ResponseWriter, r *http.Request) {
  2. err := r.ParseForm()
  3. if err != nil {
  4. //处理错误,例如http.Error()
  5. return
  6. }
  7. log.Println(r.Form)
  8. rootHandler(w, r)
  9. }
英文:

Looks like you need to call ParseForm first. From the go docs

  1. // Form contains the parsed form data, including both the URL
  2. // field&#39;s query parameters and the POST or PUT form data.
  3. // This field is only available after ParseForm is called.
  4. // The HTTP client ignores Form and uses Body instead.
  5. Form url.Values

And some code to get your example working.

  1. func formHandler(w http.ResponseWriter, r *http.Request) {
  2. err := r.ParseForm()
  3. if err != nil {
  4. //handle error http.Error() for example
  5. return
  6. }
  7. log.Println(r.Form)
  8. rootHandler(w, r)
  9. }

huangapple
  • 本文由 发表于 2012年12月9日 02:20:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/13780414.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定