Go Web 入門與實戰系列:解析請求體

這是我參與8月更文挑戰的第4天,活動詳情查看: 8月更文挑戰html

Web 應用程序是一種能夠經過 Web 訪問的應用程序,Web 程序的最大好處是用戶很容易訪問應用程序,用戶只須要有瀏覽器便可,不須要再安裝其餘軟件。Web 應用對於身處互聯網時代的咱們來講太廣泛。不管哪種語言,只要它可以開發出與人類交互的軟件,它就必然會支持 Web 應用開發。數據庫

本系列文章將會介紹 Go Web 的應用與實踐。歡迎關注。瀏覽器

上一篇文章主要介紹了 Web 工做的幾個概念以及處理請求的部分原理。本將會繼續分析收發請求的其餘過程,重點分析請求體的解析。服務器

解析請求體

在絕大多數狀況下, POST 請求都是經過 HTML 表單發送的,表單是一個包含表單元素的區域。表單元素(好比:文本域、下拉列表、單選框、複選框等等)是容許用戶在表單中輸入信息的元素。表單使用表單標籤(markdown

)定義。

表單是咱們日常編寫 Web 應用經常使用的工具,經過表單咱們能夠方便的讓客戶端和服務器進行數據的交互。以下代碼所示是一個登陸頁表單:函數

<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 的路由,經過登陸頁表單提交登陸信息,在服務端進行驗證登陸的結果。工具

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.tpl")
		log.Println(t.Execute(w, nil))
	} else {
		//請求的是登陸數據,那麼執行登陸的邏輯判斷
		_ = r.ParseForm()
		fmt.Println("username:", r.Form["username"])
		fmt.Println("password:", r.Form["password"])
		if pwd := r.Form.Get("password"); pwd == "123456" { // 驗證密碼是否正確
			fmt.Fprintf(w, "歡迎登錄,Hello %s!", r.Form.Get("username")) //這個寫入到w的是輸出到客戶端的
		} else {
			fmt.Fprintf(w, "密碼錯誤,請從新輸入!")
		}
	}
}

func sayHelloName(w http.ResponseWriter, r *http.Request) {
	_ = r.ParseForm() //解析url傳遞的參數,對於POST則解析響應包的主體(request body)
	//注意:若是沒有調用ParseForm方法,下面沒法獲取表單的數據
	fmt.Println(r.Form) //這些信息是輸出到服務器端的打印信息
	fmt.Println("path", r.URL.Path)
	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ""))
	}
	fmt.Fprintf(w, "Hello aoho!") //這個寫入到w的是輸出到客戶端的
}

func main() {
	http.HandleFunc("/", sayHelloName)       //設置訪問的路由
	http.HandleFunc("/login", login)         
	err := http.ListenAndServe(":8080", nil) //設置監聽的端口
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}
複製代碼

如前所述,服務端實現時首先使用 ParseForm() 方法對請求進行表單的語法分析,而後訪問表單的具體字段。post

遞交表單到服務器的 /login,當用戶輸入信息點擊登陸以後,會跳轉到服務器的路由 login,咱們首先要判斷是 POST 仍是 GET 方式傳遞過來。Http 包裏面有一個很簡單的方式就能夠獲取,獲取請求方法是經過 r.Method 來完成的,返回字符串類型的變量,包括 GET、POST 和 PUT 等方法。url

當咱們在瀏覽器裏面打開 http://127.0.0.1:8080/login 的時候,出現以下界面:spa

image.png

login 函數中咱們根據 r.Method 來判斷是顯示登陸界面仍是處理登陸邏輯。當 GET 方式請求時顯示登陸界面,其餘方式請求時則處理登陸邏輯,如查詢數據庫、驗證登陸信息等。在上述的代碼中,咱們簡單驗證了密碼字符串爲 123456 即爲登陸成功,並返回用戶名。不然,登陸失敗,並提示用戶。結果以下面兩張圖所示:

login-success.jpg

輸入用戶名和正確的密碼以後,提交表單返回的是對應的用戶名。

image.png

當服務端的密碼驗證錯誤時,返回的是登陸失敗,服務咱們設定的預期。

小結

本文主要解析了請求體的實現,經過登陸頁表單的示例,提交登陸信息並在服務端進行驗證登陸的結果,從而介紹瞭解析請求體的過程。下面的文章將會繼續介紹分析收發請求的其餘過程。

閱讀最新文章,關注公衆號:aoho求索

相關文章
相關標籤/搜索