Gin框架基础使用附带各种小案例和整个登录模块的实现
前言:
Gin框架介绍
- Gin框架功能:
在介绍Gin框架之前我们要先明白Gin框架要完成那些功能,当用户在浏览器发送一条url的时候(前端发起请求),我们后端要如何接受这个请求,如果接受这个请求的话,如何获取这条请求携带的参数,并且在接受任何请求进行真正的处理函数之前,如果要进行统一的操作(如权限验证等),应该如何设置。以上是Gin框架最最最主要的功能。而满足这些功能的框架都被统称为Http Web框架,因此Gin是一个Go的web框架。
使用示例
安装Gin框架
- 前提条件:安装好Go并能正常使用
- 使用步骤:
打开终端窗口,运行以下命令:
$ go get -u github.com/gin-gonic/gin
如果你使用了Go包管理工具,例如go mod,但是如果你不确定,那么运行上述命令总是不会错的。
使用代码
package main
import (
"net/http"(Gin依赖的内置包)
"github.com/gin-gonic/gin"
)
func main() {
// 1.创建引擎
engine := gin.Default()
// 2. 注册接口
engine.GET("/", func(c *gin.Context) {//具体接口需要执行的函数
c.JSON(200, gin.H{"Status": 200, "Message": "成功", "Data": 响应主要数据": ""}})
})
// 3.监听端口,默认在8080
engine.Run(":8080")
}
接收参数的方法
- Param方式
name := c.Param("name")
一般是url中的通配符参数,如浏览器中输入:https://blog.csdn.net/m0_64941684?spm=1000.2115.3001.5343,浏览器会输出:name=m0_64941684。 - Query方式
name := c.DefaultQuery("name", "晴天阿良")
,前端有则用前端的,没有则默认为晴天阿良
name := c.Query
从前端获取 - PostForm方式
username := c.PostForm("username")
一般是post请求的表单参数 - body方式
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
engine := gin.Default()
// 2. 注册接口
login := engine.Group("/login")//分组
login.POST("/login", controller.LoginHandler)
}
func LoginHandler(c *gin.Context) {
var u models.User
if err := c.ShouldBindJSON(&u); err != nil {
ResponseErrorWithMsg(c, CodeInvalidParams, err.Error())
return
}
}
//用户结构体
type User struct {
UserID string `json:"user_id" db:"user_id"`
UserName string `json:"username" db:"username"`
Password string `json:"password" db:"password"`
Role int `json:"role" db:"role"`
}
简易登录模块
package main
import (
"net/http"(Gin依赖的内置包)
"github.com/gin-gonic/gin"
)
func main() {
// 1.创建引擎
engine := gin.Default()
// 2. 注册接口
login := engine.Group("/login")//分组
login.POST("/login", controller.LoginHandler) //登录(下面有登录的具体实现)
login.POST("/signup", controller.SignUpHandler) //注册
login.GET("/refresh_token", controller.RefreshTokenHandler) //刷新token
// 3.监听端口,默认在8080
engine.Run(":8080")
}
func LoginHandler(c *gin.Context) {
var u models.User
if err := c.ShouldBindJSON(&u); err != nil {
zap.L().Error("invalid params", zap.Error(err))
ResponseErrorWithMsg(c, CodeInvalidParams, err.Error())
return
}
//从数据库中取数据,这里是操作数据库(不是Gin框架的功能)没有重点实现,后面讲sqlx时会重点讲。
if err := mysql.Login(&u); err != nil {
ResponseError(c, CodeInvalidPassword)
return
}
// 生成Token(具体的实现方法这里也没有重点介绍)
Uint64Value, _ := strconv.ParseUint(u.UserID, 10, 64)
aToken, rToken, _ := jwt.GenToken(Uint64Value)
ResponseSuccess(c, gin.H{
"accessToken": aToken,
"refreshToken": rToken,
"userID": u.UserID,
"username": u.UserName,
"role": u.Role,
})
}
//用户结构体
type User struct {
UserID string `json:"user_id" db:"user_id"`
UserName string `json:"username" db:"username"`
Password string `json:"password" db:"password"`
Role int `json:"role" db:"role"`
}
Gin的边角料
- Gin 是使用 Go/golang 语言实现的 HTTP Web 框架。接口简洁,性能极高。截止 1.4.0 版本,包含测试代码,仅14K,其中测试代码 9K 左右,也就是说框架源码仅 5K 左右。
- 路由功能强大:Gin提供了灵活的路由机制,支持RESTful API设计,并且可以很容易地定义复杂的路由规则。(以后会深入讲解Gin的前缀树,路由树,异常处理,模板渲染,JSON解析与绑定,监控和日志等功能)
- WebSocket支持:Gin框架内置了对WebSocket的支持,方便实现实时通信功能。(以后也会深入讲解)
- 社区活跃:Gin有着一个活跃的社区,提供了大量的第三方扩展包和插件。