使用 Golang 发布 HTML 表单方法

Pik*_*nde 2 html forms methods post go

所以,我在 html 中有这个表单。它旨在对/subscribe页面发出 POST 请求:

<html>
  <form action="/subscribe" method="post">
    First Name: <input type="text" name="first_name" placeholder="Willy"/><br/>
    Last Name: <input type="text" name="last_name" placeholder="Warmwood"/><br/>
    Email: <input type="email" name="email" placeholder="willy.warwood@gmail.com"/><br/>
    <input type="submit" value="Submit"/>
  </form>
</html>
Run Code Online (Sandbox Code Playgroud)

然后,我在 golang 中有这个路由器:

http.HandleFunc("/subscribe/", SubscribeHandler)
Run Code Online (Sandbox Code Playgroud)

golang 中的这个处理程序:

func SubscribeHandler(w http.ResponseWriter, r *http.Request) {
    log.Println(r.Method)
}
Run Code Online (Sandbox Code Playgroud)

但问题是,它总是打印GET.

如何发布表单,所以值r.MethodPOST

谢谢

dav*_*ave 5

根据文档:

如果已经注册了子树并且接收到命名子树根而没有其尾部斜杠的请求,ServeMux 将该请求重定向到子树根(添加尾部斜杠)。此行为可以通过不带尾部斜杠的路径的单独注册来覆盖。

因为你注册的"/subscribe/"尾随斜杠,它被注册为子树。再次,根据文档:

以斜杠结尾的模式命名一个有根的子树

因为 HTTP 重定向(实际上)总是一个 GET 请求,所以重定向之后的方法当然是一个 GET。您可以看到在此示例中发生了真正的重定向:https : //play.golang.org/p/OcEhVDosTNf

解决方案是同时注册:

http.HandleFunc("/subscribe/", SubscribeHandler)
http.HandleFunc("/subscribe", SubscribeHandler)
Run Code Online (Sandbox Code Playgroud)

或者将您的表单指向带有 的表单/

<form action="/subscribe/" method="post">
Run Code Online (Sandbox Code Playgroud)