W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
先來看一個表單遞交的例子,我們有如下的表單內(nèi)容,命名成文件login.gtpl(放入當前新建項目的目錄里面)
<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>
上面遞交表單到服務(wù)器的/login
,當用戶輸入信息點擊登陸之后,會跳轉(zhuǎn)到服務(wù)器的路由login
里面,我們首先要判斷這個是什么方式傳遞過來,POST還是GET呢?
http包里面有一個很簡單的方式就可以獲取,我們在前面web的例子的基礎(chǔ)上來看看怎么處理login頁面的form數(shù)據(jù)
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strings"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析url傳遞的參數(shù),對于POST則解析響應(yīng)包的主體(request body)
//注意:如果沒有調(diào)用ParseForm方法,下面無法獲取表單的數(shù)據(jù)
fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //這個寫入到w的是輸出到客戶端的
}
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) //渲染模板,并發(fā)送
} else {
//請求的是登陸數(shù)據(jù),那么執(zhí)行登陸的邏輯判斷
//解析表單
r.ParseForm()
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
}
}
func main() {
http.HandleFunc("/", sayhelloName) //設(shè)置訪問的路由
http.HandleFunc("/login", login) //設(shè)置訪問的路由
err := http.ListenAndServe(":9090", nil) //設(shè)置監(jiān)聽的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
通過上面的代碼我們可以看出獲取請求方法是通過r.Method
來完成的,這是個字符串類型的變量,返回GET, POST, PUT等method信息。
login函數(shù)中我們根據(jù)r.Method
來判斷是顯示登錄界面還是處理登錄邏輯。當GET方式請求時顯示登錄界面,其他方式請求時則處理登錄邏輯,如查詢數(shù)據(jù)庫、驗證登錄信息等。
當我們在瀏覽器里面打開http://127.0.0.1:9090/login
的時候,出現(xiàn)如下界面
如果你看到一個空頁面,可能是你寫的 login.gtpl 文件中有錯誤,請根據(jù)控制臺中的日志進行修復(fù)。
我們輸入用戶名和密碼之后發(fā)現(xiàn)在服務(wù)器端是不會打印出來任何輸出的,為什么呢?默認情況下,Handler里面是不會自動解析form的,必須顯式的調(diào)用?r.ParseForm()
?后,你才能對這個表單數(shù)據(jù)進行操作。我們修改一下代碼,在?fmt.Println("username:", r.Form["username"])
?之前加一行?r.ParseForm()
?,重新編譯,再次測試輸入遞交,現(xiàn)在是不是在服務(wù)器端有輸出你的輸入的用戶名和密碼了。
?r.Form
?里面包含了所有請求的參數(shù),比如URL中query-string、POST的數(shù)據(jù)、PUT的數(shù)據(jù),所以當你在URL中的query-string字段和POST沖突時,會保存成一個slice,里面存儲了多個值,Go官方文檔中說在接下來的版本里面將會把POST、GET這些數(shù)據(jù)分離開來。
現(xiàn)在我們修改一下login.gtpl里面form的action值?http://127.0.0.1:9090/login
?修改為?http://127.0.0.1:9090/login?username=astaxie
?,再次測試,服務(wù)器的輸出username是不是一個slice。服務(wù)器端的輸出如下:
request.Form
是一個url.Values類型,里面存儲的是對應(yīng)的類似key=value
的信息,下面展示了可以對form數(shù)據(jù)進行的一些操作:
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"))
fmt.Println(v["friend"])
Tips: Request本身也提供了FormValue()函數(shù)來獲取用戶提交的參數(shù)。如r.Form["username"]也可寫成r.FormValue("username")。調(diào)用r.FormValue時會自動調(diào)用r.ParseForm,所以不必提前調(diào)用。r.FormValue只會返回同名參數(shù)中的第一個,若參數(shù)不存在則返回空字符串。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: