Gin网络请求与路由处理
来源:https://www.qfgolang.com/?special=ginkuangjia&pid=2783
创建Engine
gin框架中,Engine被定义为一个结构体。包含:
- 路由组
- 中间件
- 页面渲染接口
- 框架配置设置
- .....
创建方式
-
engine1 = gin.Default()
-
engine2 = gin.New()
gin.Default也使用gin.New()创建engine实例,但是会默认使用Logger和Recovery中间件。Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试;Recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.Default创建Engine实例。
http请求处理
http请求类型
options
head
get <--
post <--
put
delete <--
trace
connect
http通用处理
engine中使用Handle方法进行http请求的处理:
func (group *RouterGroup)Handle(httpMethod string, relativePath string, handlers HandlerFunc) IRoutes
- httpMethod:第一个参数表示要处理的HTTP的请求类型,是GET、POST、DELETE等8种请求类型中的一种。
- relativePath:第二个参数表示要解析的接口,由开发者进行定义。
- handlers:第三个参数是处理对应的请求的代码的定义。
...
engine.Handle("GET", "/hello", func(context *gin.Context) {
//获取请求接口
fmt.Println(context.FullPath())
//获取字符串参数
name := context.DefaultQuery("name", "")
fmt.Println(name)
//输出
context.Writer.Write([]byte("Hello ," + name))
})
...
可以通过context.Query和context.DefaultQuery获取GET请求携带的参数。
可以通过context.Writer.Write向请求发起端返回数据。
shortcut
其他方法类似
// GET is a shortcut for router.Handle("GET", path, handle).
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
return group.handle(http.MethodGet, relativePath, handlers)
}
参数查询(如表单查询)
context.DefaultQuery: 除了context.DefaultQuery方法获取请求携带的参数数据以外,还可以使用context.Query方法来获取Get请求携带的参数。
context.GetPostForm获取表单数据:POST请求以表单的形式提交数据,除了可以使用context.PostForm获取表单数据意外,还可以使用context.GetPostForm来获取表单数据。
路由处理
普通处理
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)
})
context.Param获取请求参数
...
engine.DELETE("/user/:id", DeleteHandle)
func DeleteHandle(context *gin.Context) {
fmt.Println(context.FullPath())
userID := context.Param("id")
fmt.Println(userID)
context.Writer.Write([]byte("Delete user's id : " + userID))
}
...
客户端的请求接口是DELETE类型,请求url为:http://localhost:9000/user/1。
RouterGroup
之所以engine中包含通用型的Handle和分类处理的GET、POST等类型的方法,是因为Engine中有RouterGroup作为匿名字段。
RouteGroup可以称之为路由集合,在gin中定义为结构体:
type RouterGroup struct {
Handlers HandlersChain
basePath string
engine *Engine
root bool
}
RouteGroup的作用就是为每一个服务请求提供解析功能,并指定每一个请求对应的处理程序。
路由分组
在实际的项目开发中,均是模块化开发。同一模块内的功能接口,往往会有相同的接口前缀。比如如下所示:
例如在系统中有用户模块,用户有不同注册、登录、用户信息、
注册:http://localhost:9000/user/register
登录:http://localhost:9000/user/login
用户信息:http://localhost:9000/user/info
删除:http://localhost:9000/user/1001
Group
gin框架中可以使用路由组来实现对路由的分类。
我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}
包裹同组的路由,这只是为了看着清晰,你用不用{}
包裹功能上没什么区别。路由组也是支持嵌套的。
路由组是router.Group中的一个方法
engine := gin.Default()
userGroup := engine.Group("/user")
{
userGroup.GET("/register", registerHandle)
userGroup.GET("/login", loginHandle)
userGroup.GET("/info", infoHandle)
xx := userGroup.Group("/xx")
xx.GET("/oo", xxHandle)
}
engine.Run(":9000")
Gin框架中的路由使用的是httprouter这个库。其基本原理就是构造一个路由地址的前缀树。