从上一页收集到数据后,我想向客户显示另一页。但是我在服务器端重定向新URL时遇到麻烦。这是我的逻辑:
我坚持执行第3步(这里是流程示例):
type Stuff struct{ List []string } func checkcheck(w http.ResponseWriter, r *http.Request) { sinfo := Stuff{ List: some_slice } t, err := template.New("").Parse(tpl_ds) checkErr(err) err = r.ParseForm() checkErr(err) err = t.Execute(w, sinfo) checkErr(err) if r.Method == "POST" { saveChoice(r.Form["choices"]) /* step 3: make user open another URL */ } }
这是模板:
<html> <script> $(function () { $('form').on('submit', function (e) { e.preventDefault(); $.ajax({ type: 'post', data: $('form').serialize(), }); }); }); </script> <body> <form method="POST"> {{range .List}} <input type="checkbox" name="choices" value="{{.}}"> <span>{{.}}</span><br> {{end}} <input type="submit" value="Submit"> </form> </body> </html>
我可以知道如何重定向到新页面吗?
ps如果我将URL放在按钮上,则服务器将不会运行saveChoice()
http状态303是此处的适当响应。因此,使用它重定向请求。
if r.Method == "POST" { saveChoice(r.Form["choices"]) http.Redirect(w, r, newUrl, http.StatusSeeOther) }
并且如果您newUrl应该将正确的html页面返回到浏览器,则无需使用ajax。使用HTML表单。
newUrl
<form action="/postHandler" method="post"> {{range .List}} <input type="checkbox" name="choices" value="{{.}}"> <span>{{.}}</span><br> {{end}} <input type="submit" value="Submit"> </form>
action表格的通知定义为/postHandler。将在其中运行您的saveChoice函数的端点的名称放在此处。
action
/postHandler
saveChoice
因此,为了避免http: multiple response.WriteHeader calls错误,您可以使用此代码。
http: multiple response.WriteHeader calls
func checkcheck(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { sinfo := Stuff{ List: some_slice } t, err := template.New("").Parse(tpl_ds) checkErr(err) err = r.ParseForm() checkErr(err) err = t.Execute(w, sinfo) checkErr(err) } if r.Method == "POST" { saveChoice(r.Form["choices"]) http.Redirect(w, r, newUrl, http.StatusSeeOther) } }
否则,服务器将尝试呈现表单和重定向的URL,这将导致对响应编写器的多次调用。