亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Go 入門教程 Go 入門教程 47 使用 gin 包優化登錄功能

上一個實戰文章我們學習了如何使用 Go 語言原生的 http 包來構建一個 web 應用,實現了一個簡單的登錄功能。因為原生的 http 包很多功能都需要自己去寫,所以就有很多開發者在原生包的基礎上開發了第三方包。本文就來介紹一個開發 Go web 十分流行的包—— gin 包。其官方地址為:https://github.com/gin-gonic/gin。

1. 下載 gin 包

因為是第三方包,所以需要從 github 上下載后才可使用。使用以下指令下載使用:

go get https://github.com/gin-gonic/gin

可能會比較久,如果覺得下載不便的話,可以直接使用 go mod 來構建項目,就可以跳過下載這個步驟。

2. 搭建服務

本文將使用 go mod 來構建項目,所以先在一個空白項目中執行

go mod init

然后再在 Go 文件寫入以下代碼構建 web 服務,代碼示例:

package main

import (
    "github.com/gin-gonic/gin"//導入gin包
)

func main() {
    router := gin.Default()//實例化一個gin
    router.Run("127.0.0.1:9300")//監聽9300端口
}

啟動述代碼就可以啟動一個 gin 的 web 服務,此時會打印一些 gin 的日志,表示服務已啟動。

Tips:如果你事前沒有gin包,gomod會幫你自動下載。

圖片描述

此時在在瀏覽器中輸入127.0.0.1:9300/index。會報出404,于此同時,控制臺中會打印相關錯誤,這個功能也是我很喜歡的一個功能。

圖片描述

3. 編寫路由

服務已經啟動了,接下來看看如何創建 gin 的路由。和前文一樣,我們先來創建一個處理 GET 請求的路由/index。

代碼示例:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    //創建get請求
    router.GET("/index", func(c *gin.Context) {
        c.String(http.StatusOK, "<h1>Hello Codey!</h1>")
    })
    router.Run("127.0.0.1:9300")
}

執行上述代碼之后,在瀏覽器中輸入127.0.0.1:9300/index。

你會發現**<h1>這個標簽沒有被瀏覽器識別,而是以字符串的形式輸出了**。

圖片描述

這是因為 gin 框架中對輸出做出了嚴格的分類,在 c.String() 函數中輸出的值只會是字符串的形式輸出,這是在原生函數之上為了**防止XSS(****跨站腳本攻擊)**而做的優化。所以它無法直接打印 html 腳本來渲染頁面,必須要使用 c.HTML() 函數來加載 html 文件。

代碼示例:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")//設定html存放的文件目錄
    router.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)//打開view.index.html
    })
    router.Run("127.0.0.1:9300")
}

目錄結構如下

圖片描述

index.html 代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go語言實戰2</title>
</head>
<body>
    <div>
        <h3>登錄</h3>
        <form action="check" method="POST">
            <div>
                <div>
                    <input type="text"  id="username" name="username" placeholder="請輸入賬號">
                </div>
            </div>
            <div>
                <div>
                    <input type="password" class="form-control" id="password" name="password" placeholder="請輸入密碼">
                </div>
            </div>
            <div >
                <div >
                    <button id="loginbtn" type="submit" >登錄</button>
                </div>
            </div>
        </form>
    </div>
</body>
</html>

執行上述代碼之后,在瀏覽器中輸入127.0.0.1:9300/index。

圖片描述

此處可以結合函數式編程的思想,將 index 的處理函數拿出來作為一個變量,代碼修改后如下所示:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")
    router.GET("/index", index)
    router.Run("127.0.0.1:9300")
}

func index(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", nil)
}

4. 數據傳輸

然后我們就用 gin 來寫一個 post 服務 check 用來接收驗證登錄頁面發送過來的賬號密碼。

代碼示例:

package main

import (
    "fmt"
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")
    router.GET("/index", index)
    router.POST("/check", check)
    router.Run("127.0.0.1:9300")
}

func index(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", nil)
}

func check(c *gin.Context) {
    accountID, _ := c.GetPostForm("username")
    password, _ := c.GetPostForm("password")
    fmt.Println(accountID, password)
    if accountID == "Codey" && password == "12345" {
        //跳轉到主頁
        c.HTML(http.StatusOK, "home.html", nil)
    } else {
        //跳轉到登錄
        c.Writer.Write([]byte("<script>alert('賬號或者密碼不正確')</script>"))
        c.HTML(http.StatusOK, "index.html", nil)
    }

}

home.html 代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go語言實戰2</title>
</head>
<body>
    <div>
        <h3>主頁</h3>
       這里是主頁
    </div>
</body>
</html>

執行上述 Go 語言代碼,在瀏覽器中輸入127.0.0.1:9300/index。

圖片描述

輸入正確的賬號:Codey,密碼:12345

圖片描述
然后點擊登錄,會跳轉到主頁

圖片描述

若輸入錯誤的賬號密碼,則不跳轉

圖片描述

隨后跳轉回登錄頁面

圖片描述

在 gin 中一個簡易的登錄功能就搭建完成了。

5. 小結

本文主要使用了gin這個第三方開發包,來搭建了一個Go語言的web應用,這個gin包的本質還是http包,但是它在其上封裝了一層接口,使我們可以更高效的開發以及開發出來的應用更安全。在我們Go語言的學習和開發的過程中,在熟悉了官方庫之后,我們也可以去使用一些能更好的幫助我們開發的第三方包。