创建表单

新增路由:

  1. func articlesCreateHandler(w http.ResponseWriter, r *http.Request) {
  2. fmt.Fprint(w, "创建博文表单")
  3. }

添加一个处理函数:

  1. router.HandleFunc("/articles/create",articlesCreateHandler).Methods("GET").Name("articles.create")

修改 articlesCreateHandler 函数,返回表单内容:

  1. func articlesCreateHandler(w http.ResponseWriter, r *http.Request) {
  2. html := `
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <title>创建文章 —— 我的技术博客</title>
  7. </head>
  8. <body>
  9. <form action="%s" method="post">
  10. <p><input type="text" name="title"></p>
  11. <p><textarea name="body" cols="30" rows="10"></textarea></p>
  12. <p><button type="submit">提交</button></p>
  13. </form>
  14. </body>
  15. </html>
  16. `
  17. storeURL, _ := router.Get("articles.store").URL()
  18. fmt.Fprintf(w, html, storeURL)
  19. }

并将 router 的声明移到包之外。注意:包级别的变量声明时不能使用 := 语法,修改为带关键词 var 的变量声明即可。

  1. var router = mux.NewRouter()

保存后将编译成功,浏览器访问 localhost:3000/articles/create ,可以看到表单。

读取表单提交参数

修改 articlesStoreHandler() 函数,打印提交的参数:

  1. func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {
  2. err := r.ParseForm()
  3. if err != nil {
  4. // 解析错误,这里应该有错误处理
  5. fmt.Fprint(w, "请提供正确的数据!")
  6. return
  7. }
  8. title := r.PostForm.Get("title")
  9. fmt.Fprintf(w, "POST PostForm: %v <br>", r.PostForm)
  10. fmt.Fprintf(w, "POST Form: %v <br>", r.Form)
  11. fmt.Fprintf(w, "title 的值为: %v", title)
  12. }

关于错误处理,一般常见的简写是:

  1. if err := r.ParseForm(); err != nil {
  2. // 解析错误,这里应该有错误处理
  3. fmt.Fprint(w, "请提供正确的数据!")
  4. return
  5. }

打印出来的数据可见 r.PostFormr.Form 的数据是一样的。

  • Form:存储了 post、put 和 get 参数,在使用之前需要调用 Form 方法。
  • PostForm:存储了 post、put 参数,在使用之前需要调用 ParseForm 方法。

修改表单提交请求:

  1. <form action="%s?test=data" method="post">
  2. <p><input type="text" name="title"></p>
  3. <p><textarea name="body" cols="30" rows="10"></textarea></p>
  4. <p><button type="submit">提交</button></p>
  5. </form>

如不想获取所有的请求内容,而是逐个获取的话,这也是比较常见的操作,无需使用 r.ParseForm() 可直接使用 r.FormValue()r.PostFormValue() 方法:

  1. func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {
  2. fmt.Fprintf(w, "r.Form 中 title 的值为: %v <br>", r.FormValue("title"))
  3. fmt.Fprintf(w, "r.PostForm 中 title 的值为: %v <br>", r.PostFormValue("title"))
  4. fmt.Fprintf(w, "r.Form 中 test 的值为: %v <br>", r.FormValue("test"))
  5. fmt.Fprintf(w, "r.PostForm 中 test 的值为: %v <br>", r.PostFormValue("test"))
  6. }