路由(Routing )是由一个 URI (或者叫路径)和一个特定的 HTTP 方法( GET 、 POST 等)
组成的,涉及到应用如何响应客户端对某个网站节点的访问。
1**、GET POST以及获取Get Post传值**
1.1**、Get请求传值**
GET /user?uid=20&page=1
router.GET("/user", func(c *gin.Context) {
uid := c.Query("uid")
page := c.DefaultQuery("page", "0")
c.String(200, "uid=%v page=%v", uid, page)
})
1.2**、动态路由传值**
域名 /user/20
r.GET("/user/:uid", func(c *gin.Context) {
uid := c.Param("uid")
c.String(200, "userID=%s", uid)
})
1.3**、Post请求传值 获取form表单数据**
定义一个 add_user.html 的页面
{{ define "default/add_user.html" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/doAddUser" method="post">
用户名:<input type="text" name="username" />
密码: <input type="password" name="password" />
<input type="submit" value="提交">
</form>
</body>
</html>
{{end}}
通过 c.PostForm 接收表单传过来的数据
router.GET("/addUser", func(c *gin.Context) {
c.HTML(200, "default/add_user.html", gin.H{})
})
router.POST("/doAddUser", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
age := c.DefaultPostForm("age", "20")
c.JSON(200, gin.H{
"usernmae": username,
"password": password,
"age": age,
})
})
1.4**、获取GET POST传递的数据绑定到结构体**
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的 Content-Type
识别请求数据类型并利用反射机制自动提取请求中 QueryString 、 form 表单、 JSON 、 XML 等
参数到结构体中。 下面的示例代码演示了 .ShouldBind() 强大的功能,它能够基于请求自动提
取 JSON 、 form 表单和 QueryString 类型的数据,并把值绑定到指定的结构体对象。
//注意首字母大写
type Userinfo struct {
Username string `form:"username" json:"user"`
Password string `form:"password" json:"password"`
}
Get****传值绑定到结构体
/?username=zhangsan&password=123456
router.GET("/", func(c *gin.Context) {
var userinfo Userinfo
if err := c.ShouldBind(&userinfo); err == nil {
c.JSON(http.StatusOK, userinfo)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
返回数据
{"user":"zhangsan","password":"123456"}
Post 传值绑定到结构体
router.POST("/doLogin", func(c *gin.Context) {
var userinfo Userinfo
if err := c.ShouldBind(&userinfo); err == nil {
c.JSON(http.StatusOK, userinfo)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
返回数据
{"user":"zhangsan","password":"123456"}
1.5、获取 Post Xml 数据
在 API 的开发中,我们经常会用到 JSON 或 XML 来作为数据交互的格式,这个时候我们
可以在 gin 中使用 c.GetRawData() 获取数据。
<?xml version="1.0" encoding="UTF-8"?>
<article>
<content type="string">我是张三 </content>
<title type="string">张三 </title>
</article>
type Article struct {
Title string `xml:"title"`
Content string `xml:"content"`
}
router.POST("/xml", func (c *gin.Context) {
b, _ := c.GetRawData() // 从 c.Request.Body 读取请求数据
article := &Article{}
iferr := xml.Unmarshal(b, &article); err == nil {
c.JSON(http.StatusOK, article)
} else{
c.JSON(http.StatusBadRequest, err.Error())
}
})
2**、简单的路由组**
https://gin-gonic.com/zh-cn/docs/examples/grouping-routes/
func main() {
router := gin.Default()
// 简单的路由组 : v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
v1.POST("/read", readEndpoint)
}
// 简单的路由组 : v2
v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
router.Run(":8080")
}
3**、Gin路由文件 分组**
3.1、新建 routes 文件夹,routes 文件下面新建 adminRoutes.go、apiRoutes.go、 defaultRoutes.go
1、新建 adminRoutes.go
package routes
import (
"net/http"
"github.com/gin-gonic/gin"
)
func AdminRoutesInit(router *gin.Engine) {
adminRouter := router.Group("/admin")
{
adminRouter.GET("/user", func(c *gin.Context) {
c.String(http.StatusOK, "用户")
})
adminRouter.GET("/news", func(c *gin.Context) {
c.String(http.StatusOK, "news")
})
}
}
2**、新建****apiRoutes.go**
package routes
import (
"net/http"
"github.com/gin-gonic/gin"
)
func ApiRoutesInit(router *gin.Engine) {
apiRoute := router.Group("/api")
{
apiRoute.GET("/user", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"username": "张三",
"age": 20,
})
})
apiRoute.GET("/news", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"title": "这是新闻",
})
})
}
}
3、新建 defaultRoutes.go
package routes
import (
"github.com/gin-gonic/gin"
)
func DefaultRoutesInit(router *gin.Engine) {
defaultRoute := router.Group("/")
{
defaultRoute.GET("/", func(c *gin.Context) {
c.String(200, "首页")
})
}
}
3.2 、配置 main.go
package main
import (
"gin_demo/routes"
"github.com/gin-gonic/gin"
)
// 注意首字母大写
type Userinfo struct {
Username string `form:"username" json:"user"`
Password string `form:"password" json:"password"`
}
func main() {
r := gin.Default()
routes.AdminRoutesInit(r)
routes.ApiRoutesInit(r)
routes.DefaultRoutesInit(r)
r.Run(":8080")
}
访问 /api/user /admin/user 测试