1.处理表单的输入

获取请求方法是通过r.Method来完成的,这是个字符串类型的变量,返回GET, POST, PUT等method信息。
默认情况下,Handler里面是不会自动解析form的,必须显式的调用r.ParseForm()后,你才能对这个表单数据进行操作。

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "text/template"
  7. )
  8. func sayhelloName(w http.ResponseWriter, r *http.Request) {
  9. r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主题(request body)
  10. //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
  11. fmt.Println("path", r.URL.Path)
  12. fmt.Println("scheme", r.URL.Scheme)
  13. for k, v := range r.Form {
  14. fmt.Println("key:", k, " val:", v)
  15. }
  16. fmt.Fprintf(w, "hello world")
  17. }
  18. func login(w http.ResponseWriter, r *http.Request) {
  19. fmt.Println("method:", r.Method)
  20. if r.Method == "GET" {
  21. t, err := template.ParseFiles("chapter19/login/login.gtpl")
  22. if err != nil {
  23. fmt.Println(err)
  24. }
  25. log.Println(t.Execute(w, nil))
  26. } else {
  27. r.ParseForm()
  28. fmt.Println("username", r.Form["username"])
  29. fmt.Println("password", r.Form["password"])
  30. }
  31. }
  32. func main() {
  33. http.HandleFunc("/", sayhelloName)
  34. http.HandleFunc("/login", login)
  35. err := http.ListenAndServe(":9090", nil)
  36. if err != nil {
  37. log.Fatal("listenAndServe: ", err)
  38. }
  39. }

request.Form是一个url.Values类型,里面存储的是对应的类似key=value的信息,下面展示了可以对form数据进行的一些操作:

  1. v := url.Values{}
  2. v.Set("name", "Ava")
  3. v.Add("friend", "Jess")
  4. v.Add("friend", "Sarah")
  5. v.Add("friend", "Zoe")
  6. // v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
  7. fmt.Println(v.Get("name"))
  8. fmt.Println(v.Get("friend"))
  9. fmt.Println(v["friend"])

2.验证表单的输入

必填字段

你想要确保从一个表单元素中得到一个值,例如前面小节里面的用户名,我们如何处理呢?

  1. if len(r.Form["username"][0])==0{
  2. //为空的处理
  3. }

数字

如果我们是判断正整数,那么我们先转化成int类型,然后进行处理

  1. getint,err:=strconv.Atoi(r.Form.Get("age"))
  2. if err!=nil{
  3. //数字转化出错了,那么可能就不是数字
  4. }
  5. //接下来就可以判断这个数字的大小范围了
  6. if getint >100 {
  7. //太大了
  8. }

正则表达式处理

  1. if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
  2. return false
  3. }

中文

对于中文我们目前有两种方式来验证,可以使用 unicode 包提供的func Is(rangeTab *RangeTable, r rune) bool来验证,也可以使用正则方式来验证,这里使用最简单的正则方式,如下代码所示

  1. if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m {
  2. return false
  3. }

英文

  1. if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
  2. return false
  3. }

下拉菜单

如果我们想要判断表单里面