表单
- 什么是表单?
- 表单是一个包含表单元素的区域,用户可以往表单里面填写信息,表单也是前端页面的元素
处理表单输入
-
我们通过一个例子来看go是如何处理表单输入的
-
客户端递交表单到服务器/login,当用户输入信息点击登录之后,会跳转到服务器的路由login里面,我们首先要判断这个由什么方式传递过来?
-
http包就有个很简单的方式就可以获取,就是 r.Method ,这是个字符串类型的变量
-
下面写个方法来做登录处理逻辑
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method: ", r.Method)
if r.Method == "GET" {
fmt.Println(r.URL)
} else {
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
}
}
- 然后将这个方法注入到main方法中
func main() {
http.HandleFunc("/", getWeb)
http.HandleFunc("/login", login)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
- 运行一下,然后通过postman模拟客户端发送请求,后台打印出数据
- 但是我们发现,并没有将表单中的 username 和 password 给打印出来,为什么呢?
- 因为默认情况下,Handler并不会帮你解析form,需要你自己调用一下 r.ParseForm() 才可以,所以我们在POST方法中加入进去,再测试一下
- 通过上图我们可以看到,这样就能获取到信息
- r.Form里面包含了所有请求的参数,比如URL中query-string、POST的数据、PUT的数据,当你在URL的query-string字段和POST冲突时,会保存成一个slice,里面存储了多个值,Go语言官方文档中说在接下来的版本中将会把POST、GET这些数据分离开来。
- 当我们在url后面加上参数,服务器输出的有两个值,不再是一个值
- 这就说明 form 是一个map[string][]string数组
验证表单的输入
- 开发web的一个原则就是,不能信任用户,所以验证和过滤用户的输入信息就变得非常重要,下面就来讲讲服务器验证
- 对于数字进行验证:
//数字判断一
num, err := strconv.Atoi(r.Form.Get("password"))
if err != nil {
fmt.Println("数字转化出错!")
}
fmt.Println(num)
//数字判断二 正则表达式
if m, _ := regexp.MatchString("^(0-9)+$", r.Form.Get("password")); !m {
fmt.Println("数字转化出错!")
}
- 对于中文进行验证:
//中文判断
if m, _ := regexp.MatchString("[\u4e00-\u9fa5]", r.Form.Get("username")); !m {
fmt.Println("中文转化出错!")
}
fmt.Println(r.Form.Get("username"))
- 对于英文进行验证:
//英文判断
if m, _ := regexp.MatchString("^[a-zA-z]+$", r.Form.Get("username")); !m {
fmt.Println("英文转化出错!")
}
fmt.Println(r.Form.Get("username"))
- 对于邮箱进行验证:
//电子邮箱地址
if m, _ := regexp.MatchString("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", r.Form.Get("email")); !m {
fmt.Println("邮箱转化出错!")
}
fmt.Println(r.Form.Get("email"))
- 对于手机进行验证:
//手机号
if m, _ := regexp.MatchString("0?(13|14|15|17|18|19)[0-9]{9}", r.Form.Get("phone")); !m {
fmt.Println("手机转化出错!")
}
fmt.Println(r.Form.Get("phone"))
- 对于身份证进行验证:
//身份证
if m, _ := regexp.MatchString("\\d{17}[\\d|x]|\\d{15}", r.Form.Get("idcard")); !m {
fmt.Println("身份证转化出错!")
}
fmt.Println(r.Form.Get("idcard"))