1.处理表单的输入
获取请求方法是通过r.Method来完成的,这是个字符串类型的变量,返回GET, POST, PUT等method信息。
默认情况下,Handler里面是不会自动解析form的,必须显式的调用r.ParseForm()后,你才能对这个表单数据进行操作。
package mainimport ( "fmt" "log" "net/http" "text/template")func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主题(request body) //注意:如果没有调用ParseForm方法,下面无法获取表单的数据 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) for k, v := range r.Form { fmt.Println("key:", k, " val:", v) } fmt.Fprintf(w, "hello world")}func login(w http.ResponseWriter, r *http.Request) { fmt.Println("method:", r.Method) if r.Method == "GET" { t, err := template.ParseFiles("chapter19/login/login.gtpl") if err != nil { fmt.Println(err) } log.Println(t.Execute(w, nil)) } else { r.ParseForm() fmt.Println("username", r.Form["username"]) fmt.Println("password", r.Form["password"]) }}func main() { http.HandleFunc("/", sayhelloName) http.HandleFunc("/login", login) err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("listenAndServe: ", err) }}
request.Form是一个url.Values类型,里面存储的是对应的类似key=value的信息,下面展示了可以对form数据进行的一些操作:
v := url.Values{}v.Set("name", "Ava")v.Add("friend", "Jess")v.Add("friend", "Sarah")v.Add("friend", "Zoe")// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"fmt.Println(v.Get("name"))fmt.Println(v.Get("friend"))fmt.Println(v["friend"])
2.验证表单的输入
必填字段
你想要确保从一个表单元素中得到一个值,例如前面小节里面的用户名,我们如何处理呢?
if len(r.Form["username"][0])==0{ //为空的处理}
数字
如果我们是判断正整数,那么我们先转化成int类型,然后进行处理
getint,err:=strconv.Atoi(r.Form.Get("age"))if err!=nil{ //数字转化出错了,那么可能就不是数字}//接下来就可以判断这个数字的大小范围了if getint >100 { //太大了}
正则表达式处理
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m { return false}
中文
对于中文我们目前有两种方式来验证,可以使用 unicode 包提供的func Is(rangeTab *RangeTable, r rune) bool来验证,也可以使用正则方式来验证,这里使用最简单的正则方式,如下代码所示
if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m { return false}
英文
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m { return false}
下拉菜单
如果我们想要判断表单里面