十五、表单
1.处理表单的输入
新增一个login.html文件
<html> <head> <title></title> </head> <body> <form action="http://127.0.0.1:9090/login?username=astaxie" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" value="登陆"> </form> </body> </html>
1 package main 2 3 import ( 4 "fmt" 5 "html/template" 6 "log" 7 "net/http" 8 "strings" 9 ) 10 11 //浏览器里面打开http://127.0.0.1:9090/login 12 13 func sayhelloName(w http.ResponseWriter, r *http.Request) { 14 r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body) 15 //注意:如果没有调用ParseForm方法,下面无法获取表单的数据 16 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 17 fmt.Println("path", r.URL.Path) 18 fmt.Println("scheme", r.URL.Scheme) 19 fmt.Println(r.Form["url_long"]) 20 for k, v := range r.Form { 21 fmt.Println("key:", k) 22 fmt.Println("val:", strings.Join(v, "")) 23 } 24 fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的 25 } 26 27 func login(w http.ResponseWriter, r *http.Request) { 28 fmt.Println("method:", r.Method) //获取请求的方法 29 if r.Method == "GET" { 30 t, _ := template.ParseFiles("login.html") 31 t.Execute(w, nil) 32 } else { 33 //请求的是登陆数据,那么执行登陆的逻辑判断 34 r.ParseForm() 35 fmt.Println("username:", r.Form["username"]) 36 fmt.Println("password:", r.Form["password"]) 37 } 38 } 39 40 func main() { 41 http.HandleFunc("/", sayhelloName) //设置访问的路由 42 http.HandleFunc("/login", login) //设置访问的路由 43 err := http.ListenAndServe(":9090", nil) //设置监听的端口 44 if err != nil { 45 log.Fatal("ListenAndServe: ", err) 46 } 47 }
结果:
method: POST
username: [astaxie liubiao]
password: [123456]
map[]
path /favicon.ico
scheme
[]
2.验证表单的输入
2.1 必填字段
if len(r.Form["username"][0])==0{ //为空的处理 }
复选框和单选按钮通过r.Form.Get()来获取值
2.2 数字
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
return false
}
2.3 中文
if m, _ := regexp.MatchString("^[\\x{4e00}-\\x{9fa5}]+$", r.Form.Get("realname")); !m {
return false
}
2.4 英文
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
return false
}
2.5 电子邮件
if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
fmt.Println("no")
}else{
fmt.Println("yes")
}
2.6 手机号码
if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
return false
}
2.7 下拉菜单
slice:=[]string{"apple","pear","banane"}
for _, v := range slice {
if v == r.Form.Get("fruit") {
return true
}
}
return false
2.8 单选按钮
slice:=[]int{1,2}
for _, v := range slice {
if v == r.Form.Get("gender") {
return true
}
}
return false
2.9 复选框
操作slice和map的库),https://github.com/astaxie/beeku
slice:=[]string{"football","basketball","tennis"}
a:=Slice_diff(r.Form["interest"],slice)
if a == nil{
return true
}
return false
2.10 日期和时间
t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Printf("Go launched at %s\n", t.Local())
2.11 身份证号码
//验证15位身份证,15位的是全部数字
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("usercard")); !m {
return false
}
//验证18位身份证,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
return false
}
浙公网安备 33010602011771号