如何在 golang 的同一个处理程序中处理多个 POST 请求?
How to handle multiple POST requests in same handler in golang?
我在 signup.html 文件中有两个要执行的表单。
- 第一个表单重定向到
/login
但不会将数据插入数据库。
- 第二种形式既不插入数据也不重定向到注册页面。
如果我将两个 action
设置为相同的 link,那么它会将数据插入到数据库中。如何执行多个 POST
请求并重定向到多个页面
单一功能?
谢谢!
controllers.go
func Signup(w http.ResponseWriter, r *http.Request) error {
if r.Method == "GET" {
return SignupTmpl.Execute(w, nil)
} else if r.Method == "POST" && http.MethodPost == "Register" {
register := models.RegisterUser{
Name: r.FormValue("name"),
Email: r.FormValue("email"),
Password: r.FormValue("password"),
}
values := [3]string{register.Name, register.Email, register.Password}
database.InsertRegister(values)
return LoginTmpl.Execute(w, nil)
} else if r.Method == "POST" && http.MethodPost == "Newsletter" {
Newsletter(w, r)
return SignupTmpl.Execute(w, nil)
}
return nil
}
signup.html
// Signup form
<form class="form" method="post" action="/login">
...
<input type="submit" value="Register">
</form>
// Newsletter form
<form class="newsletter" method="post" action="/signup">
...
<input type="submit" value="Newsletter">
</form>
http.MethodPost == "Register"
...
http.MethodPost == "Newsletter"
这些比较毫无意义。 http.MethodPost
is a constant 其中包含 HTTP Post 请求的动词 ("POST")。常量变量优于硬编码值,因为与硬编码字符串不同,typeo 会导致编译时错误。
<input type="submit" value="Newsletter">
如果你想能够访问这个输入标签的值,你需要给它一个name
:
<input type="submit" name="operation" value="Newsletter">
然后您可以检查该表单值:
if r.Method == "GET" {
return SignupTmpl.Execute(w, nil)
} else if r.Method == "POST" {
if r.FormValue("operation") == "Register" {
...
} else if r.FormValue("operation") == "Newsletter" {
...
}
}
我个人会为所有这些操作编写不同的处理程序,然后将它们指向不同的 URL。您的大部分处理程序逻辑都是路由,可以使用不同的处理程序免费完成。但是你所做的很好 - 只要确保:
- 命名您稍后需要参考的输入字段
- 不要将 'POST' 与 'POST' 进行比较,将命名的输入字段值与预期值进行比较
我在 signup.html 文件中有两个要执行的表单。
- 第一个表单重定向到
/login
但不会将数据插入数据库。 - 第二种形式既不插入数据也不重定向到注册页面。
如果我将两个 action
设置为相同的 link,那么它会将数据插入到数据库中。如何执行多个 POST
请求并重定向到多个页面
单一功能?
谢谢!
controllers.go
func Signup(w http.ResponseWriter, r *http.Request) error {
if r.Method == "GET" {
return SignupTmpl.Execute(w, nil)
} else if r.Method == "POST" && http.MethodPost == "Register" {
register := models.RegisterUser{
Name: r.FormValue("name"),
Email: r.FormValue("email"),
Password: r.FormValue("password"),
}
values := [3]string{register.Name, register.Email, register.Password}
database.InsertRegister(values)
return LoginTmpl.Execute(w, nil)
} else if r.Method == "POST" && http.MethodPost == "Newsletter" {
Newsletter(w, r)
return SignupTmpl.Execute(w, nil)
}
return nil
}
signup.html
// Signup form
<form class="form" method="post" action="/login">
...
<input type="submit" value="Register">
</form>
// Newsletter form
<form class="newsletter" method="post" action="/signup">
...
<input type="submit" value="Newsletter">
</form>
http.MethodPost == "Register" ... http.MethodPost == "Newsletter"
这些比较毫无意义。 http.MethodPost
is a constant 其中包含 HTTP Post 请求的动词 ("POST")。常量变量优于硬编码值,因为与硬编码字符串不同,typeo 会导致编译时错误。
<input type="submit" value="Newsletter">
如果你想能够访问这个输入标签的值,你需要给它一个name
:
<input type="submit" name="operation" value="Newsletter">
然后您可以检查该表单值:
if r.Method == "GET" {
return SignupTmpl.Execute(w, nil)
} else if r.Method == "POST" {
if r.FormValue("operation") == "Register" {
...
} else if r.FormValue("operation") == "Newsletter" {
...
}
}
我个人会为所有这些操作编写不同的处理程序,然后将它们指向不同的 URL。您的大部分处理程序逻辑都是路由,可以使用不同的处理程序免费完成。但是你所做的很好 - 只要确保:
- 命名您稍后需要参考的输入字段
- 不要将 'POST' 与 'POST' 进行比较,将命名的输入字段值与预期值进行比较