作者的 Gin 框架学习是根据 B站视频 Gin教程_Golang框架Gin入门实战教程 来学习的,对大地老师的评价不吹不捧,很喜欢其讲课风格,而且这个视频特别适合小白学习,强烈推荐。
路由
路由(Routing)是由一个 URL(或者叫路径)和一个特定的 HTTP 方法(GET、POST等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。
GET 请求传值
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
// localhost:8080/get?username=zhangsan&password=123
r.GET("/get", func(c *gin.Context) {
// 使用c.Query()获取请求当中的参数
username := c.Query("username")
password := c.Query("password")
// 当请求路径当中没有带有 age 参数时,使用默认值18
age := c.DefaultQuery("age", "18")
c.JSON(http.StatusOK, gin.H{
"msg": "Get...",
"username": username,
"password": password,
"age": age,
})
})
r.Run()
}
使用 Postman 进行测试
动态路由传值
域名/user/20
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/user/:uid", func(c *gin.Context) {
// 使用c.Param()获取请求当中的参数
uid := c.Param("uid")
c.JSON(http.StatusOK, gin.H{
"msg": "动态路由传值...",
"uid": uid,
})
})
r.Run()
}
使用 Postman 进行测试
POST 请求传值(获取form表单数据)
add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/toAdd" method="post">
用户名 <input type="text" name="username"><br><br>
密码 <input type="password" name="password"><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
// 配置模板的文件
r.LoadHTMLGlob("templates/*")
// 输入localhost:8080/add 跳转到add.html页面
r.GET("/add", func(c *gin.Context) {
c.HTML(200, "add.html", gin.H{})
})
r.POST("/toAdd", func(c *gin.Context) {
// 使用c.PostForm()获取请求当中的参数
username := c.PostForm("username")
password := c.PostForm("password")
// 当表单当中没有 age ,使用默认值18
age := c.DefaultPostForm("age", "18")
c.JSON(200, gin.H{
"username": username,
"password": password,
"age": age,
})
})
r.Run()
}
简单的路由组
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
userRoutes := r.Group("/user")
{
userRoutes.GET("/add", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "userAdd...",
})
})
userRoutes.GET("/edit", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "userEdit...",
})
})
}
adminRoutes := r.Group("/admin")
{
userRoutes.GET("/add", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "adminAdd...",
})
})
userRoutes.GET("/edit", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "adminEdit...",
})
})
}
r.Run()
}
使用 Postman 进行测试
Gin 路由文件分组
在项目的根目录下新建 routes 文件夹,并新建 go 文件
DefaultRoutes.go
package routes
import "github.com/gin-gonic/gin"
func DefaultRoutesInit(r *gin.Engine) {
defaultRoutes := r.Group("/")
{
defaultRoutes.GET("/", func(c *gin.Context) {
c.String(200, "首页")
})
defaultRoutes.GET("/news", func(c *gin.Context) {
c.String(200, "新闻")
})
}
}
AdminRoutes.go
package routes
import "github.com/gin-gonic/gin"
func AdminRoutesInit(r *gin.Engine) {
adminRoutes := r.Group("/admin")
{
adminRoutes.GET("/", func(c *gin.Context) {
c.String(200, "admin...")
})
adminRoutes.GET("/userlist", func(c *gin.Context) {
c.String(200, "admin---userlist")
})
adminRoutes.GET("/plist", func(c *gin.Context) {
c.String(200, "admin---plist")
})
}
}
ApiRoutes.go
package routes
import "github.com/gin-gonic/gin"
func ApiRoutesInit(r *gin.Engine) {
apiRoutes := r.Group("/api")
{
apiRoutes.GET("/", func(c *gin.Context) {
c.String(200, "我是一个api接口")
})
apiRoutes.GET("/userlist", func(c *gin.Context) {
c.String(200, "我是一个api接口---userlist")
})
apiRoutes.GET("/plist", func(c *gin.Context) {
c.String(200, "我是一个api接口---plist")
})
}
}
main.go
package main
import (
"Gin_demo/routes"
"fmt"
"github.com/gin-gonic/gin"
"html/template"
"time"
)
func main() {
r := gin.Default()
// 配置模板的文件
r.LoadHTMLGlob("templates/*")
// 配置静态web目录 第一个参数表示路由,第二个参数表示映射的路径.
r.Static("/static", "./static")
routes.DefaultRoutesInit(r)
routes.ApiRoutesInit(r)
routes.AdminRoutesInit(r)
r.Run()
}