Gin路由深入

路由(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 测试

相关推荐
桃园码工18 小时前
2-Gin 框架中的路由 --[Gin 框架入门精讲与实战案例]
gin·路由·实战案例
海绵波波10718 小时前
Gin-vue-admin(2):项目初始化
vue.js·golang·gin
海绵波波10718 小时前
Gin-vue-admin(4):项目创建前端一级页面和二级页面
前端·vue.js·gin
程序猿-瑞瑞2 天前
23 go语言(golang) - gin框架安装及使用(四)
开发语言·golang·gin
zyh_0305213 天前
GIN
开发语言·后端·golang·gin
海绵波波1074 天前
Gin-vue-admin(1):环境配置和安装
前端·vue.js·gin
程序猿-瑞瑞4 天前
22 go语言(golang) - gin框架安装及使用(三)
开发语言·golang·gin
Xvens5 天前
Golang Gin Redis+Mysql 同步查询更新删除操作(我的小GO笔记)
redis·golang·gin
ifanatic5 天前
[每周一更]-(第127期):Go新项目-Gin中使用超时中间件实战(11)
中间件·golang·gin
免檒5 天前
基于base64Captcha实现验证码功能
开发语言·后端·中间件·gin