路由的概念
路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。
但在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)
}