获取没有收到go语言表单的数据

时间:2015-02-19 15:20:43

标签: go

这是astaxie的书中的简单形式  当我尝试' /登录' ,我得到

No Data received { Unable to load the webpage because the server sent no data.   Error code: ERR_EMPTY_RESPONSE }

以下是代码:

main.go

package main
import (
    "fmt"
    "html/template"
    "net/http"

)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello astaxie!") // write data to response
}

func login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //get request method
    if r.Method == "GET" {
      t, err :=template.New("").Parse(loginHtml)
      if err != nil {
          panic(err)
      }

      const loginHtml = `
      <html>
      <head>
      <title></title>
      </head>
      <body>
      <form action="/login" method="post">
          Username:<input type="text" name="username">
          Password:<input type="password" name="password">
          <input type="submit" value="Login">
      </form>
      </body>
      </html>
      `

    }    else {
        r.ParseForm()
        // logic part of log in
        fmt.Println("username:", r.PostFormValue("username"))
        fmt.Println("password:", r.PostFormValue("password"))
    }
}


func main() {
    http.HandleFunc("/", sayhelloName) // setting router rule
    http.HandleFunc("/login", login)
   http.ListenAndServe(":9090", nil) // setting listening port

}

#login.gtpl
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
    Username:<input type="text" name="username">
    Password:<input type="password" name="password">
    <input type="submit" value="Login">
</form>
</body>
</html>

Any idea??

1 个答案:

答案 0 :(得分:2)

原始问题(已多次编辑)的问题是您的ParseFiles()功能失败,无法读取您的模板文件。你不知道这个,因为它返回的error刚被丢弃。 永远不要这样做!您可以做的最少的事情就是打印错误,或者如果发生错误,请致电panic(err)。你能做到吗,你会立即看到原因。

如果您指定相对路径,则login.gtpl文件必须放在您启动app的工作目录中。或者指定绝对路径。

您还可以将HTML源代码放入Go文件中,直到您解决问题为止:

t, err := template.New("").Parse(loginHtml)
if err != nil {
    panic(err)
}
t.Execute(w, nil)
// ... the rest of your code


// At the end of your .go source file (outside of login() func) insert:
const loginHtml = `
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
    Username:<input type="text" name="username">
    Password:<input type="password" name="password">
    <input type="submit" value="Login">
</form>
</body>
</html>
`

注意#1:

由于您的HTML模板只是一个静态HTML,因此只需将其发送到输出,而无需构建并执行模板:

// Instead of calling template.New(...).Parse(...) and t.Execute(...), just do:
w.Write([]byte(loginHtml))

注意#2:

Request.Form仅在调用Request.ParseForm()后可用,因此在访问之前就是这样。另外,对于POST表单,您可能希望使用Request.PostForm

作为替代方案,您可以使用Request.PostFormValue()方法,如果尚未调用它,它会自动为您执行此操作:

fmt.Println("username:", r.PostFormValue("username"))
fmt.Println("password:", r.PostFormValue("password"))