这是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??
答案 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"))