普通路由
r.GET("/index", func(c *gin.Context) {...})r.GET("/login", func(c *gin.Context) {...})r.POST("/login", func(c *gin.Context) {...})
此外,还有一个可以匹配所有请求方法的Any方法如下:
r.Any("/test", func(c *gin.Context) {...})
为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回views/404.html页面。
r.NoRoute(func(c *gin.Context) {c.HTML(http.StatusNotFound, "views/404.html", nil)})
路由组
我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。
func main() {r := gin.Default()userGroup := r.Group("/user"){userGroup.GET("/index", func(c *gin.Context) {...})userGroup.GET("/login", func(c *gin.Context) {...})userGroup.POST("/login", func(c *gin.Context) {...})}shopGroup := r.Group("/shop"){shopGroup.GET("/index", func(c *gin.Context) {...})shopGroup.GET("/cart", func(c *gin.Context) {...})shopGroup.POST("/checkout", func(c *gin.Context) {...})}r.Run()}
路由组也是支持嵌套的,例如:
shopGroup := r.Group("/shop"){shopGroup.GET("/index", func(c *gin.Context) {...})shopGroup.GET("/cart", func(c *gin.Context) {...})shopGroup.POST("/checkout", func(c *gin.Context) {...})// 嵌套路由组xx := shopGroup.Group("xx")xx.GET("/oo", func(c *gin.Context) {...})}
路由原理
Gin框架中的路由使用的是httprouter这个库。
其基本原理就是构造一个路由地址的前缀树。
Handler处理器
路由需要传入两个参数,一个为路径,另一个为路由执行的方法,我们叫做它处理器 Handler ,而且,该参数是可变长参数。也就是说,可以传入多个 handler,形成一条 handler chain 。
同时对 handler 该函数有着一些要求,该函数需要传入一个 Gin.Context 指针,同时要通过该指针进行值得处理。
Handler 函数可以对前端返回 字符串,Json,Html 等多种格式或形式文件。
我们已GET为例,其内部实现如下:
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {return group.handle(http.MethodGet, relativePath, handlers)}
获取路由路径中的参数
获取路径中的参数
获取路径中的参数用context.Param。在定义路由的时候用/:后面的符号是一个占位符,我们可以对该值进行传值。如下:
package mainimport ("github.com/gin-gonic/gin""net/http")func main() {// 1、创建路由g := gin.Default()// 2、绑定路由规则,执行视图函数g.GET("/usr/:name", func(c *gin.Context) {// 获取值name := c.Param("name")// 3、返回值c.String(http.StatusOK,name)})// 4、开启监听g.Run(":8000")}
然后我们在浏览器上输入如下地址http://127.0.0.1:8000/usr/joker,那么我们获取到的name就是joker,并返回给我们,如下:
获取queryString参数
querystring指的是URL中?后面携带的参数,例如:/user/search?username=joker&age=30。
获取请求的querystring参数的方法如下:
package mainimport ("github.com/gin-gonic/gin""net/http")func main() {// 1、创建路由g := gin.Default()// 2、绑定路由规则,执行视图函数g.GET("/usr/:name", func(c *gin.Context) {// 获取值name := c.Param("name")username := c.Query("username")age := c.Query("age")// 3、返回值c.String(http.StatusOK,"name: "+name+" username: "+username+"age: "+age)})// 4、开启监听g.Run(":8000")}

还可以使用DefaultQuery()为没有设置参数的值设置一个默认值。
如下:
username := c.DefaultQuery("username", "joker")
使用QueryArray()获取多个值。
ids = c.QueryArrary("ids")
请求:http://127.0.0.1:8000/query?ids=1,2,3,4,5
使用QueryMap()获取Map类型的数据
user = c.QueryMap("name")
请求:http://127.0.0.1:8000/query?user[name]=joker&user[age]=18
