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 Userinfoif 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 Userinfoif 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{}if err := 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()// 简单的路由组 : v1v1 := router.Group("/v1"){v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)}// 简单的路由组 : v2v2 := 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 routesimport ("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 routesimport ("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 routesimport ("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 mainimport ("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 测试