GO WEB 学习笔记WEB 表单

2022-09-17 09:08:50

表单

  • 什么是表单?
  • 表单是一个包含表单元素的区域,用户可以往表单里面填写信息,表单也是前端页面的元素

处理表单输入

  • 我们通过一个例子来看go是如何处理表单输入的
    在这里插入图片描述

  • 客户端递交表单到服务器/login,当用户输入信息点击登录之后,会跳转到服务器的路由login里面,我们首先要判断这个由什么方式传递过来?

  • http包就有个很简单的方式就可以获取,就是 r.Method ,这是个字符串类型的变量

  • 下面写个方法来做登录处理逻辑

funclogin(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方法中
funcmain(){
	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"))

预防跨站脚本

处理文件上传

  • 作者:程序胖
  • 原文链接:https://blog.csdn.net/qq_41816516/article/details/124660004
    更新时间:2022-09-17 09:08:50