2_Gin网络请求与路由处理.md
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这个库。其基本原理就是构造一个路由地址的前缀树。
本文作者:nsfoxer's blog
本文链接:https://www.cnblogs.com/nsfoxer/p/16317580.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步