2_Gin网络请求与路由处理.md

Gin网络请求与路由处理

来源:https://www.qfgolang.com/?special=ginkuangjia&pid=2783

创建Engine

​ gin框架中,Engine被定义为一个结构体。包含:

  • 路由组
  • 中间件
  • 页面渲染接口
  • 框架配置设置
  • .....

创建方式

  1. engine1 = gin.Default()

  2. 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这个库。其基本原理就是构造一个路由地址的前缀树。

原文地址:https://www.cnblogs.com/nsfoxer/p/14436925.html