|
3 | 3 | 先来看一个表单递交的例子,我们有如下的表单内容,命名成文件login.gtpl(放入当前新建项目的目录里面)
|
4 | 4 | ```html
|
5 | 5 |
|
6 |
| - <html> |
7 |
| - <head> |
8 |
| - <title></title> |
9 |
| - </head> |
10 |
| - <body> |
11 |
| - <form action="/login" method="post"> |
12 |
| - 用户名:<input type="text" name="username"> |
13 |
| - 密码:<input type="password" name="password"> |
14 |
| - <input type="submit" value="登陆"> |
15 |
| - </form> |
16 |
| - </body> |
17 |
| - </html> |
| 6 | +<html> |
| 7 | +<head> |
| 8 | +<title></title> |
| 9 | +</head> |
| 10 | +<body> |
| 11 | +<form action="/login" method="post"> |
| 12 | + 用户名:<input type="text" name="username"> |
| 13 | + 密码:<input type="password" name="password"> |
| 14 | + <input type="submit" value="登陆"> |
| 15 | +</form> |
| 16 | +</body> |
| 17 | +</html> |
18 | 18 | ```
|
19 | 19 | 上面递交表单到服务器的`/login`,当用户输入信息点击登陆之后,会跳转到服务器的路由`login`里面,我们首先要判断这个是什么方式传递过来,POST还是GET呢?
|
20 | 20 |
|
21 | 21 | http包里面有一个很简单的方式就可以获取,我们在前面web的例子的基础上来看看怎么处理login页面的form数据
|
22 | 22 | ```Go
|
23 | 23 |
|
24 |
| - package main |
25 |
| - |
26 |
| - import ( |
27 |
| - "fmt" |
28 |
| - "html/template" |
29 |
| - "log" |
30 |
| - "net/http" |
31 |
| - "strings" |
32 |
| - ) |
33 |
| - |
34 |
| - func sayhelloName(w http.ResponseWriter, r *http.Request) { |
35 |
| - r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body) |
36 |
| - //注意:如果没有调用ParseForm方法,下面无法获取表单的数据 |
37 |
| - fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 |
38 |
| - fmt.Println("path", r.URL.Path) |
39 |
| - fmt.Println("scheme", r.URL.Scheme) |
40 |
| - fmt.Println(r.Form["url_long"]) |
41 |
| - for k, v := range r.Form { |
42 |
| - fmt.Println("key:", k) |
43 |
| - fmt.Println("val:", strings.Join(v, "")) |
44 |
| - } |
45 |
| - fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的 |
| 24 | +package main |
| 25 | + |
| 26 | +import ( |
| 27 | + "fmt" |
| 28 | + "html/template" |
| 29 | + "log" |
| 30 | + "net/http" |
| 31 | + "strings" |
| 32 | +) |
| 33 | + |
| 34 | +func sayhelloName(w http.ResponseWriter, r *http.Request) { |
| 35 | + r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body) |
| 36 | + //注意:如果没有调用ParseForm方法,下面无法获取表单的数据 |
| 37 | + fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 |
| 38 | + fmt.Println("path", r.URL.Path) |
| 39 | + fmt.Println("scheme", r.URL.Scheme) |
| 40 | + fmt.Println(r.Form["url_long"]) |
| 41 | + for k, v := range r.Form { |
| 42 | + fmt.Println("key:", k) |
| 43 | + fmt.Println("val:", strings.Join(v, "")) |
46 | 44 | }
|
47 |
| - |
48 |
| - func login(w http.ResponseWriter, r *http.Request) { |
49 |
| - fmt.Println("method:", r.Method) //获取请求的方法 |
50 |
| - if r.Method == "GET" { |
51 |
| - t, _ := template.ParseFiles("login.gtpl") |
52 |
| - log.Println(t.Execute(w, nil)) |
53 |
| - } else { |
54 |
| - //请求的是登陆数据,那么执行登陆的逻辑判断 |
55 |
| - fmt.Println("username:", r.Form["username"]) |
56 |
| - fmt.Println("password:", r.Form["password"]) |
57 |
| - } |
| 45 | + fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的 |
| 46 | +} |
| 47 | + |
| 48 | +func login(w http.ResponseWriter, r *http.Request) { |
| 49 | + fmt.Println("method:", r.Method) //获取请求的方法 |
| 50 | + if r.Method == "GET" { |
| 51 | + t, _ := template.ParseFiles("login.gtpl") |
| 52 | + log.Println(t.Execute(w, nil)) |
| 53 | + } else { |
| 54 | + //请求的是登陆数据,那么执行登陆的逻辑判断 |
| 55 | + fmt.Println("username:", r.Form["username"]) |
| 56 | + fmt.Println("password:", r.Form["password"]) |
58 | 57 | }
|
59 |
| - |
60 |
| - func main() { |
61 |
| - http.HandleFunc("/", sayhelloName) //设置访问的路由 |
62 |
| - http.HandleFunc("/login", login) //设置访问的路由 |
63 |
| - err := http.ListenAndServe(":9090", nil) //设置监听的端口 |
64 |
| - if err != nil { |
65 |
| - log.Fatal("ListenAndServe: ", err) |
66 |
| - } |
| 58 | +} |
| 59 | + |
| 60 | +func main() { |
| 61 | + http.HandleFunc("/", sayhelloName) //设置访问的路由 |
| 62 | + http.HandleFunc("/login", login) //设置访问的路由 |
| 63 | + err := http.ListenAndServe(":9090", nil) //设置监听的端口 |
| 64 | + if err != nil { |
| 65 | + log.Fatal("ListenAndServe: ", err) |
67 | 66 | }
|
| 67 | +} |
68 | 68 |
|
69 | 69 | ```
|
70 | 70 | 通过上面的代码我们可以看出获取请求方法是通过`r.Method`来完成的,这是个字符串类型的变量,返回GET, POST, PUT等method信息。
|
@@ -92,16 +92,16 @@ login函数中我们根据`r.Method`来判断是显示登录界面还是处理
|
92 | 92 | `request.Form`是一个url.Values类型,里面存储的是对应的类似`key=value`的信息,下面展示了可以对form数据进行的一些操作:
|
93 | 93 | ```Go
|
94 | 94 |
|
95 |
| - v := url.Values{} |
96 |
| - v.Set("name", "Ava") |
97 |
| - v.Add("friend", "Jess") |
98 |
| - v.Add("friend", "Sarah") |
99 |
| - v.Add("friend", "Zoe") |
100 |
| - // v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe" |
101 |
| - fmt.Println(v.Get("name")) |
102 |
| - fmt.Println(v.Get("friend")) |
103 |
| - fmt.Println(v["friend"]) |
104 |
| - |
| 95 | +v := url.Values{} |
| 96 | +v.Set("name", "Ava") |
| 97 | +v.Add("friend", "Jess") |
| 98 | +v.Add("friend", "Sarah") |
| 99 | +v.Add("friend", "Zoe") |
| 100 | +// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe" |
| 101 | +fmt.Println(v.Get("name")) |
| 102 | +fmt.Println(v.Get("friend")) |
| 103 | +fmt.Println(v["friend"]) |
| 104 | + |
105 | 105 | ```
|
106 | 106 | >**Tips**:
|
107 | 107 | >Request本身也提供了FormValue()函数来获取用户提交的参数。如r.Form["username"]也可写成r.FormValue("username")。调用r.FormValue时会自动调用r.ParseForm,所以不必提前调用。r.FormValue只会返回同名参数中的第一个,若参数不存在则返回空字符串。
|
|
0 commit comments