菜鸟笔记
提升您的技术认知

Gin Web 网络框架

Gin Web 网络框架

Gin框架介绍

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点。

Gin特点和特性

  • 速度:Gin之所以被很多企业和团队所采用,第一个原因是因为其速度快,性能表现出众。基准测试

  • 中间件:和iris类型,gin在处理请求时,支持中间件操作,方便编码处理。

  • 路由:在gin中可以非常简单的实现路由解析的功能,并包含路由组解析功能。

  • 内置渲染:Gin支持JSON、XML和HTML等多种数据格式的渲染,并提供了方便的操作API。

Gin网络请求与路由处理

创建Engine

  • Engine被定义成代表gin框架的一个结构体。其中包含了路由组、中间件、页面渲染接口、框架配置设置等相关内容。
  • 默认的Engine可以通过gin.Default进行创建,或者使用gin.New()同样可以创建。router := gin.New()/ router := gin.Default()
  • gin.Default()和gin.New()的区别在于gin.Default也使用gin.New()创建Engine实例,但是会默认使用Logger和Recovery中间件。
  • Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试;Recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.Default创建Engine实例。

处理HTTP请求

restful路由通用处理

  • Handle():在Engine中使用Handle方法进行http请求的处理。Handle方法包含三个参数,具体如下所示:
    • func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers …HandlerFunc) IRoutes
    • httpMethod:第一个参数表示要处理的HTTP的请求类型,是GET、POST、DELETE等8种请求类型中的一种。
    • relativePath:第二个参数表示要解析的接口,由开发者进行定义。
    • handlers:第三个参数是处理对应的请求的函数。

restful路由分类处理

除了通用方法,Engine还可以按类型进行直接解析。Engine中包含有Get方法、Post方法、Delete方法等与HTTP请求类型对应的方法。

  • engine.GET()处理GET请求,
  • engine.POST()处理POST请求
  • 。。。

gin.Context

Context是gin框架中封装的一个结构体,这是gin框架中最重要,最基础的一个结构体对象。该结构体可以提供我们操作请求,处理请求,获取数据等相关的操作,通常称之为上下文对象,简单说为我们提供操作环境。

  • context.Param 获取请求参数:在路由地址中:+一个参数名组成路由参数。可以使用c.Params的方法读取其值。(区分版本:version := c.Param(“version”),router.Group(“/im/:version”,func)

  • context.Query和context.DefaultQuery获取GET请求携带的参数。其中DefaultQuery提供默认值,GetQuery返回值之外还包括参数是否存在。

  • http的报文体传输数据常见的格式就有四种。例如application/json,application/x-www-form-urlencoded, application/xml和multipart/form-data。后面一个主要用于图片上传。

  • context.PostForm获取表单数据:

    • PostForm从 POST url编码表单或multipart表单中返回指定的键,否则返回一个空字符串。
    • 除此之外,还可以使用context.GetPostForm来获取表单数据。其中context.GetPostForm除了返回获取到的值之外还会返回数据是否存在的标志。
  • context.BindJSON获取POST请求中的json数据。

  • context.ClientIP:ClientIP实现了一个最大努力的算法来返回真实的客户端IP用于问题定位。

  • context.Writer.Write向请求发起端返回数据。

  • context.Data:将一些数据写入响应体并更新HTTP代码。

  • context.JSON():JSON将给定的结构作为JSON序列化到响应体中。

  • context.FullPath:返回匹配的路由的全路径。对于未找到的路由返回一个空字符串。

请求参数绑定与多数据格式处理

表单实体绑定

如果表单数据较多时,使用PostForm和GetPostForm一次获取一个表单数据,开发效率较慢。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。

  • 使用ShouldBindQuery可以实现Get方式的数据请求的绑定。
  • 使用ShouldBind可以实现Post方式的提交数据的绑定工作。ShouldBind会检查Content-Type来自动选择一个绑定引擎,根据“Content-Type”头的不同会使用不同的绑定。
  • 当客户端使用Json格式进行数据提交时,使用BindJSON可以实现对数据进行绑定并自动解析。

多数据格式返回请求结果

  • context.Writer.Write方法写入[]byte数据。这里的write是http.ResponseWriter接口定义的。
  • Writer是gin框架中封装的一个ResponseWriter接口类型。此外,ResponseWriter自身还封装了WriteString方法返回数据。
  • 在项目开发中,JSON格式规范使用的更为普遍。gin框架中的context包含的JSON方法可以将结构体类型的数据转换成JSON格式的结构化数据,然后返回给客户端。
    • map[string]interface map类型的数据转换成为json格式并返回给前端
    • 结构体也是可以直接转换为JSON格式返回给客户端。
    • 除了JSON格式以外,gin框架还支持返回HTML格式的数据。可以直接渲染HTML页面。
  • gin.H封装了生成json的方式,是一个强大的工具。使用golang可以像动态语言一样写字面量的json,对于嵌套json的实现,嵌套gin.H即可。在gin中实际是定义为:type H map[string]interface{}。

使用路由组分类处理请求

在实际的项目开发中,均是模块化开发。同一模块内的功能接口,往往会有相同的接口前缀,因此Gin提供了路由组的概念,实现对路由的分类。

  • 路由组是router.Group中的一个方法,用于对请求进行分组。

  • groupRoute:=engine.Group(“/group”)

  • Group返回一个RouterGroup指针对象,而RouterGroup是gin框架中的一个路由组结构体定义。

      type RouterGroup struct {
          Handlers HandlersChain
          basePath string
          engine   *Engine
          root     bool
      }