技术概述
Gin是一个由Go(Golang)语言编写的HTTP Web框架。它提供Martini风格但是拥有更好性能的API,并且由于使用了httprouter,速度提高了近40倍。
技术详述
1.框架的安装
安装Go版本1.13以上并且执行下面Go命令行来安装Gin:
go get -u github.com/gin-gonic/gin
在代码中引用:
import "github.com/gin-gonic/gin"
2.框架的使用
- 只需要一下代码就能开启一个简单的HTTP服务器:
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run()
}
- 自定义中间件进行初始化Session
func Session(secret string) gin.HandlerFunc {
store := cookie.NewStore([]byte(secret))
store.Options(sessions.Options{HttpOnly: true, MaxAge: 7 * 86400, Path: "/", Secure: false, SameSite: http.SameSiteStrictMode})
return sessions.Sessions("gin-session", store)
}
- 使用自定义Router:
// router.go中
func NewRouter() *gin.Engine {
r := gin.Default()
// 使用中间件
r.Use(middleware.Session(os.Getenv("SESSION_SECRET")))
// 路由
......
return r
}
// main.go中
r := router.NewRouter()
- 路由接受请求
接受请求的函数接受两个参数,一个是请求的URL路径,另一个是处理这个请求的函数HandlerFunc,如:
r.POST("login", api.UserLogin)
接受到对login的POST请求的时候,就通过api.UserLogin这个函数进行处理。
HandleFunc可以在处理完业务逻辑之后,通过JSON()或其他函数将消息返回前端。
func UserLogin(c *gin.Context) {
//......
// 业务逻辑
c.JSON(http.StatusOK, res)
}
- Gin有多种从前端获取信息的方式,如:JSON,URL参数等。
// URL参数,匹配 "/user/user_name"
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
})
// URL参数,匹配 "/welcome?firstname=Jane&lastname=Doe"
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname")
})
//也可以通过c.ShouldBind()将JSON解析为结构体。
问题与解决
- 在调用JSON()函数返回JSON格式信息之后,HandlerFunc并不会返回。如果HandlerFunc中多次调用JSON()函数,请求的返回中就会出现多条JSON格式字符串。及时加上return语句即可解决问题。
- 上传文件的时候,文件本身的文件名是不可信的,需要在后端重命名后再保存。
总结
Gin框架易用性良好,学习成本较低,开发调试也十分的简单。在方便上手的同时也能够提供较高的性能,在很多场景下都是一个很好的选择。