GO隨筆-表單輸入

表單的處理

對於表單form都不陌生,GO是如何處理表單的呢?
先寫個例子:html

<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便可看到登錄界面。緊接着輸入用戶名和密碼便可完成登錄。
中間都發生了什麼事情呢?dom

  • 服務端綁定「/login」在Handle(login)上。
  • 服務端監聽9090端口。
  • 用戶訪問服務端的9090端口。而且url是「/login」
  • 服務端接收到請求,解析路由後,將該請求分配給Handle(login),進入登錄邏輯。

這就是請求的過程。以後是響應過程post

  • 經過r.Method拿到請求的方法
  • 判斷請求的方法,如果get,則渲染模板template.ParseFiles("login.gtpl")。而且將模板響應(w)t.Execute(w, nil)給客戶端,瀏覽器上顯示登錄界面。
  • 當用戶填寫完信息點擊登錄按鈕時,將表單信息以post方法請求urlaction="/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,因此沒必要提早調用。url

相關文章
相關標籤/搜索