表单的处理
对于表单form都不陌生,GO是如何处理表单的呢?
先写个例子:
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登陆">
</form>
</body>
</html>
文件命名为login.gtpl
(与html无异)
紧接着,需要有http服务
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strings"
)
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //获取请求的方法
if r.Method == "GET" {
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, nil)
} else {
r.ParseForm()
//请求的是登陆数据,那么执行登陆的逻辑判断
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
}
}
func main() {
http.HandleFunc("/login", login) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
这就写好了一个能够完成登陆操作的功能。
用户访问http://domain:9090/login
即可看到登陆界面。紧接着输入用户名和密码即可完成登陆。
中间都发生了什么事情呢?
- 服务端绑定“/login”在Handle(login)上。
- 服务端监听9090端口。
- 用户访问服务端的9090端口。并且url是“/login”
- 服务端接收到请求,解析路由后,将该请求分配给Handle(login),进入登陆逻辑。
这就是请求的过程。之后是响应过程
- 通过
r.Method
拿到请求的方法 - 判断请求的方法,若是get,则渲染模板
template.ParseFiles("login.gtpl")
。并且将模板响应(w)t.Execute(w, nil)
给客户端,浏览器上显示登陆界面。 - 当用户填写完信息点击登陆按钮时,将表单信息以post方法请求url
action="/login"
。 - 再次重复以上逻辑,判断方法为post时执行解析表单操作。
r.ParseForm()
并且将相关信息打印出来。
这里需要注意的一点是。Handler是不会自动解析表单的,需要显示的调用r.ParseForm()
。才能对表单执行操作r.Form["username"]
request.Form
是一个url.Values
类型,里面存储的是对应的类似key=value
的信息
另外Request
本身提供了FormValue()
来获取用户提供的参数。如r.Form["username"]
也可写成r.FormValue("username")
。调用r.FormValue
时会自动调用r.ParseForm
,所以不必提前调用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。