go web
最后更新于:2022-04-02 02:50:48
[TOC]
> [gitbook 参考](https://astaxie.gitbooks.io/build-web-application-with-golang/zh/)
## demo
```
package main
import (
"fmt"
"html/template"
"log"
"net/http"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
log.Println("打印到控制台") //2018/07/23 10:05:55 打印到控制台
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
}
func login(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //需要加这一步,才能解析 post 表单
fmt.Println("method:", r.Method)
if r.Method == "GET" {
t, e := template.ParseFiles("login.gtpl") //加载模板文件
if e != nil {
log.Println(e)
}
log.Println(t.Execute(w, nil))
} else {
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)
}
}
```
## 原生获取get post 参数
```
Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法。
PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法。
(x-www-form-urlencode)
MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法。(foram-data)
```
### 获取get 参数
```
//获取多个参数
values := r.URL.Query()
log.Println(values) //map[age:[1] ip:[127.0.0.1]]
//获取单个
age := values.Get("age") //1
log.Println(age)
```
### 获取post 参数
```
//获取单个
name := r.PostFormValue("name")
log.Println(name)
//获取多个
r.ParseForm()
values := r.PostForm
log.Println(values)
// 方式一.获取单个
log.Println(values["name"])
//方式二.获取单个
name = values.Get("name")
log.Println(name)
```
## request.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")) //Jess
fmt.Println(v["friend"]) //[Jess Sarah Zoe]
```
## 表单上传验证
### 判断是否是整数
```
etint, err := strconv.Atoi(r.Form.Get("age"))
if err != nil {
//数字转化出错了,那么可能就不是数字
}
fmt.Println(etint)
```
### 验证是否中文
```
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
}
```
### 电子邮件地址
```
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")
}
```
### 手机号码
```
if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
return false
}
```
### 下拉菜单
```
slice:=[]string{"apple","pear","banane"}
v := r.Form.Get("fruit")
for _, item := range slice {
if item == v {
return true
}
}
return false
```
### 单选按钮
```
slice:=[]int{1,2}
for _, v := range slice {
if v == r.Form.Get("gender") {
return true
}
}
return false
```
### 复选框
```
slice:=[]string{"football","basketball","tennis"}
a:=Slice_diff(r.Form["interest"],slice)
if a == nil{
return true
}
return false
```
> [Slice_diff 函数在github](https://github.com/astaxie/beeku)
### 日期和时间
```
t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Printf("Go launched at %s\n", t.Local())
```
### 身份证号码
```
//验证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
}
```
## 预防跨站脚本
```
fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) //输出到后台 -> <cpj>
template.HTMLEscape(w, []byte(r.Form.Get("username"))) // 输出到 客户端 -> <cpj>
```
';