开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
今天来简单学习下Gin框架入门,Gin框架使用 Go/golang 语言实现的 HTTP Web 框架,拥有更好性能的API框架
Gin框架介绍
GO语言中Web框架之一,Github上有64K+star。 基于httprouter开发的Web框架。 中文文档齐全,简单易用的轻量级框架,它具有类似 Martini 的 API,但性能比 Martini 快 40 倍.
快速入门
下载安装
$ go get -u -v github.com/gin-gonic/gin
-v:打印出被构建的代码包的名字
-u:已存在相关的代码包,强行更新代码包及其依赖包
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
将上述代码保存编译执行,然后用浏览器打开127.0.0.1:8080/test就能可以到一串JSON字符串。
- 一开始用
gin.Default()初始化了一个实例 - 紧接着使用
r.Get("/test", ...)声明了一个test路由,告诉 Gin 什么样的URL可以触发这个函数,函数的返回值就是返回给前端的数据,前端在渲染出来 - 最后用
r.Run()函数来让应用运行在本地服务器上,默认监听端口是 8080,可以传入参数设置端口,例如r.Run(":8888")即运行在 8888端口
Route路由
路由方法有Get,POST,PUT,PATCH,DELETE,OPTIONS,ANY(可以匹配任意类型的请求)
GET用来获取资源POST用来新建资源PUT用来更新资源DELETE用来删除资源。
// 无参数
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "I am YYQQ")
})
解析路径参数,通过不同的url传入不同的数据,例如 /user/:name/*role *代表可选参数
// 匹配 /user/YYQQ
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "I am %s", name)
})
$ curl http://localhost:8080/user/YYQQ
I am YYQQ
获取Query参数,例如 users?name=xxx&role=xxx
// 匹配users?name=xxx&role=xxx,role可选
r.GET("/users", func(c *gin.Context) {
name := c.Query("name")
role := c.DefaultQuery("role", "student")
c.String(http.StatusOK, "%s is a %s", name, role)
})
$ curl "http://localhost:8080/users?name=YYQQ&role=student"
I am YYQQ, role is student
获取POST参数
// POST
r.POST("/form", func(c *gin.Context) {
username := c.PostForm("username")
password := c.DefaultPostForm("password", "000000") // 可设置默认值
c.JSON(http.StatusOK, gin.H{
"username": username,
"password": password,
})
})
Query和POST参数混合
// GET 和 POST 混合
r.POST("/posts", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "0")
username := c.PostForm("username")
password := c.DefaultPostForm("username", "000000") // 可设置默认值
c.JSON(http.StatusOK, gin.H{
"id": id,
"page": page,
"username": username,
"password": password,
})
})
重定向Redirect
HTTP 重定向很容易, 内部、外部重定向均支持
路由重定向,使用 HandleContext
通过 POST 方法进行 HTTP 重定向,使用http.StatusFound
func main() {
r := gin.Default()
//http重定向
r.GET("/redirect", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
})
//路由重定向
r.GET("/goindex", func(c *gin.Context) {
c.Request.URL.Path = "/"
r.HandleContext(c)
})
//post 重定向
r.POST("/goindex", func(c *gin.Context) {
c.Redirect(http.StatusFound, "/")
})
r.GET("/", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
分组路由
如果一组的路由前缀都是/api/v1开头是不是每个路由前面都要加上/api/v1呢,显然是很麻烦的
通过分组路由可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中去,简化权限控制。
// group routes 分组路由
defaultHandler := func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"path": c.FullPath(),
})
}
// group: v1
// {} 是书写规范
v1 := r.Group("/v1")
{
v1.GET("/post", defaultHandler)
v1.GET("/update", defaultHandler)
}
// group: v2
v2 := r.Group("/v2")
{
v1.GET("/post", defaultHandler)
v1.GET("/update", defaultHandler)
}
总结
今天简单的学习了Gin的安装、路由知识,接来下会继续学习Gin的数据绑定等知识,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!