使用 gin 包优化登录功能
上一个实战文章我们学习了如何使用 Go 语言原生的 http 包来构建一个 web 应用,实现了一个简单的登录功能。因为原生的 http 包很多功能都需要自己去写,所以就有很多开发者在原生包的基础上开发了第三方包。本文就来介绍一个开发 Go web 十分流行的包—— gin 包。其官方地址为:https://github.com/gin-gonic/gin。
1. 下载 gin 包
因为是第三方包,所以需要从 github 上下载后才可使用。使用以下指令下载使用:
- 1
go get https://github.com/gin-gonic/gin
可能会比较久,如果觉得下载不便的话,可以直接使用 go mod 来构建项目,就可以跳过下载这个步骤。
2. 搭建服务
本文将使用 go mod 来构建项目,所以先在一个空白项目中执行
- 1
go mod init
然后再在 Go 文件写入以下代码构建 web 服务,代码示例:
- 1
package main
- 2
- 3
import (
- 4
"github.com/gin-gonic/gin"//导入gin包
- 5
)
- 6
- 7
func main() {
- 8
router := gin.Default()//实例化一个gin
- 9
router.Run("127.0.0.1:9300")//监听9300端口
- 10
}
启动述代码就可以启动一个 gin 的 web 服务,此时会打印一些 gin 的日志,表示服务已启动。
Tips:如果你事前没有gin包,gomod会帮你自动下载。
此时在在浏览器中输入127.0.0.1:9300/index
。会报出404,于此同时,控制台中会打印相关错误,这个功能也是我很喜欢的一个功能。
3. 编写路由
服务已经启动了,接下来看看如何创建 gin 的路由。和前文一样,我们先来创建一个处理 GET 请求的路由/index
。
代码示例:
- 1
package main
- 2
- 3
import (
- 4
"net/http"
- 5
- 6
"github.com/gin-gonic/gin"
- 7
)
- 8
- 9
func main() {
- 10
router := gin.Default()
- 11
//创建get请求
- 12
router.GET("/index", func(c *gin.Context) {
- 13
c.String(http.StatusOK, "<h1>Hello Codey!</h1>")
- 14
})
- 15
router.Run("127.0.0.1:9300")
- 16
}
执行上述代码之后,在浏览器中输入127.0.0.1:9300/index
。
你会发现**<h1>
这个标签没有被浏览器识别,而是以字符串的形式输出了**。
这是因为 gin 框架中对输出做出了严格的分类,在 c.String()
函数中输出的值只会是字符串的形式输出,这是在原生函数之上为了**防止XSS(****跨站脚本攻击)**而做的优化。所以它无法直接打印 html 脚本来渲染页面,必须要使用 c.HTML()
函数来加载 html 文件。
代码示例:
- 1
package main
- 2
- 3
import (
- 4
"net/http"
- 5
- 6
"github.com/gin-gonic/gin"
- 7
)
- 8
- 9
func main() {
- 10
router := gin.Default()
- 11
router.LoadHTMLGlob("view/*")//设定html存放的文件目录
- 12
router.GET("/index", func(c *gin.Context) {
- 13
c.HTML(http.StatusOK, "index.html", nil)//打开view.index.html
- 14
})
- 15
router.Run("127.0.0.1:9300")
- 16
}
目录结构如下
index.html 代码如下:
- 1
<!DOCTYPE html>
- 2
<html>
- 3
- 4
<head>
- 5
<meta charset="utf-8">
- 6
<title>Go语言实战2</title>
- 7
</head>
- 8
<body>
- 9
<div>
- 10
<h3>登录</h3>
- 11
<form action="check" method="POST">
- 12
<div>
- 13
<div>
- 14
<input type="text" id="username" name="username" placeholder="请输入账号">
- 15
</div>
- 16
</div>
- 17
<div>
- 18
<div>
- 19
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码">
- 20
</div>
- 21
</div>
- 22
<div >
- 23
<div >
- 24
<button id="loginbtn" type="submit" >登录</button>
- 25
</div>
- 26
</div>
- 27
</form>
- 28
</div>
- 29
</body>
- 30
</html>
执行上述代码之后,在浏览器中输入127.0.0.1:9300/index
。
此处可以结合函数式编程的思想,将 index 的处理函数拿出来作为一个变量,代码修改后如下所示:
- 1
package main
- 2
- 3
import (
- 4
"net/http"
- 5
- 6
"github.com/gin-gonic/gin"
- 7
)
- 8
- 9
func main() {
- 10
router := gin.Default()
- 11
router.LoadHTMLGlob("view/*")
- 12
router.GET("/index", index)
- 13
router.Run("127.0.0.1:9300")
- 14
}
- 15
- 16
func index(c *gin.Context) {
- 17
c.HTML(http.StatusOK, "index.html", nil)
- 18
}
4. 数据传输
然后我们就用 gin 来写一个 post 服务 check 用来接收验证登录页面发送过来的账号密码。
代码示例:
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
"net/http"
- 6
- 7
"github.com/gin-gonic/gin"
- 8
)
- 9
- 10
func main() {
- 11
router := gin.Default()
- 12
router.LoadHTMLGlob("view/*")
- 13
router.GET("/index", index)
- 14
router.POST("/check", check)
- 15
router.Run("127.0.0.1:9300")
- 16
}
- 17
- 18
func index(c *gin.Context) {
- 19
c.HTML(http.StatusOK, "index.html", nil)
- 20
}
- 21
- 22
func check(c *gin.Context) {
- 23
accountID, _ := c.GetPostForm("username")
- 24
password, _ := c.GetPostForm("password")
- 25
fmt.Println(accountID, password)
- 26
if accountID == "Codey" && password == "12345" {
- 27
//跳转到主页
- 28
c.HTML(http.StatusOK, "home.html", nil)
- 29
} else {
- 30
//跳转到登录
- 31
c.Writer.Write([]byte("<script>alert('账号或者密码不正确')</script>"))
- 32
c.HTML(http.StatusOK, "index.html", nil)
- 33
}
- 34
- 35
}
home.html 代码如下:
- 1
<!DOCTYPE html>
- 2
<html>
- 3
- 4
<head>
- 5
<meta charset="utf-8">
- 6
<title>Go语言实战2</title>
- 7
</head>
- 8
<body>
- 9
<div>
- 10
<h3>主页</h3>
- 11
这里是主页
- 12
</div>
- 13
</body>
- 14
</html>
执行上述 Go 语言代码,在浏览器中输入127.0.0.1:9300/index
。
输入正确的账号:Codey,密码:12345
然后点击登录,会跳转到主页
若输入错误的账号密码,则不跳转
随后跳转回登录页面
在 gin 中一个简易的登录功能就搭建完成了。
5. 小结
本文主要使用了gin这个第三方开发包,来搭建了一个Go语言的web应用,这个gin包的本质还是http包,但是它在其上封装了一层接口,使我们可以更高效的开发以及开发出来的应用更安全。在我们Go语言的学习和开发的过程中,在熟悉了官方库之后,我们也可以去使用一些能更好的帮助我们开发的第三方包。
文章来源于网络,侵删!