gin路由|青训营

102 阅读3分钟

路由的概念

路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。

但在gin中,路由是指URI到函数的映射。也就是说gin的基本原理是每个URI对应一个函数

router := gin.Defult()
router.Get("/user/info",func(ctx *gin.Context){
    //对应URI需要做的行为
})

以上代码就是路由的示例,Get函数的参数中,/user/info是 URI ,而后面的函数是对应的函数。

因此gin是不允许一个 URI 的相同 HTTP 方法映射多个函数的,如下:

router.Get("/user/info",func(ctx *gin.Context){
    //对应URI需要做的行为
})
router.Get("/user/info",func(ctx *gin.Context){
    //另外一个函数
})

此时,gin就会报错,返回错误码 2

不过,不同的 URI 可以映射到同一个函数。相同的 URI 的不同的 HTTP 方法可以映射到不同的函数:

	router.GET("/user", _Func)
    //相同的 URI 映射两个函数
	router.POST("/user", _Func)
    //不同的 URI 可以映射同一个函数
    router.GET("/json",_Func)

RESTful API

RESTful API 是一种规范,在该规范下,不同的HTTP方法做不同的行为。如下:

  • GET,表示读取服务器上的资源
  • POST,表示在服务器上创建资源
  • PUT,表示更新或者替换服务器上的资源
  • DELETE,表示删除服务器上的资源

可以看到,如果遵守这个规范,可以提高代码可读性;而且代码也可以变得十分的有条理,很讨喜。

gin 也推荐遵守这个规范,也有对应的函数:

router.GET("/user",_FUNC)
router.POST("/user",_FUNC)
router.PUT("/user",_FUNC)
router.DELETE("/user",_FUNC)

不过你也可以让一个函数支持所有的 HTTP 方法,也就是所有的 HTTP 方法执行同一个行为:

router.Any("/user",_FUNC)

URI

在 gin 中,一个 URI 由四个部分组成:协议、IP端口/域名、PATH、QUERY

在 gin 中,我们主要涉及的就是PATH和QUERY部分,比如上面的代码中的/user就是一个 PATH ,如果一个 URI 不存在 QUERY ,那么这个 URI 被称为静态 URI 。与之相对的 URI 中含有 QUERY 。

我们接下来主要研究对 QUERY 部分的处理。对 QUERY 的处理有两种,一种是路径参数,另一种是模糊匹配。

路径参数需要在URI中添加:符号,如下:

router.GET("/user/:id",func(ctx *gin.Context){
    id := ctx.Param("id")
    ctx.JSON(200,id)
})

这种匹配方式会匹配诸如/user/114514这种,并且你进去后会显示:id对应的数据,在这里会显示 114514

另外一种方式为模糊匹配,使用*符号,如下:

router.GET("/user/*id",func(ctx *gin.Context){
    id := ctx.Param("id")
    ctx.JSON(200,id)
})

这时该代码同样也会匹配如/user/114514这种 URI 。此外,它还能匹配/user/。并且,如果没有路由匹配了/user,那么模糊匹配同样也会匹配到/user

也就是模糊匹配支持匹配三中情况:

  • /user/114514 //路径参数也可以
  • /user/ //路径参数不可以
  • /user //特殊情况下模糊匹配可以

分组路由

上面的路由在实际开发中可能不是很方便,此时我们可以考虑使用分组路由的方式,来模块化的开发相应的功能,如下:

user_module := router.Group("/user")
{
    user_module.GET("find",_UFIND)
    user_module.POST("save",_USAVE)
}
shop_module := router.Group("/shop")
{
    shop_module.GET("find",_SFIND)
    shop_module.POST("svae",_SSAVE)
}