如何在 golang 的同一个处理程序中处理多个 POST 请求?

How to handle multiple POST requests in same handler in golang?

我在 signup.html 文件中有两个要执行的表单。

  1. 第一个表单重定向到 /login 但不会将数据插入数据库。
  2. 第二种形式既不插入数据也不重定向到注册页面。

如果我将两个 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。您的大部分处理程序逻辑都是路由,可以使用不同的处理程序免费完成。但是你所做的很好 - 只要确保:

  1. 命名您稍后需要参考的输入字段
  2. 不要将 'POST' 与 'POST' 进行比较,将命名的输入字段值与预期值进行比较