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

  • 相关阅读:
    技术期刊 · 五等分の花嫁 | Vue 3.2 正式发布!;大型项目管理策略;开源社区运营就像种菜;阮一峰的 fetch 教程;Webpack5 学习的平凡之路
    最近很火的低代码到底是什么?
    测试开发之前端篇-Web前端简介
    痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道
    痞子衡嵌入式:其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash
    《痞子衡嵌入式半月刊》 第 38 期
    [Vue深入组件]:native事件修饰符以及拓展之自定义组件的事件监听目标DOM元素自定义
    [Vue深入组件]:v-model语法糖与自定义v-model
    [Vue深入组件]:禁用 Attribute 继承
    @from [GITHUB] : Learn regex the easy way
  • 原文地址:https://www.cnblogs.com/nsfoxer/p/14436925.html
Copyright © 2020-2023  润新知