原创

go-chi框架的子包render源代码解析

温馨提示:
本文最后更新于 2020年08月30日,已超过 1,558 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

地址

https://github.com/go-chi/chi

go-chi介绍

chi是用于构建Go HTTP服务的轻巧,惯用且可组合的路由器。它特别擅长帮助您编写大型REST API服务,这些服务可随着项目的增长和更改而保持可维护性。chi它是contextGo 1.7中引入的新程序包的基础,可处理整个处理程序链中的信号,取消和请求范围的值。

该项目的重点是寻找一种优雅,舒适的设计来编写REST API服务器,该服务器是在Pressly API服务的开发过程中编写的,该服务为我们的公共API服务提供了支持,而公共API服务又为我们所有的客户端应用程序提供了支持。

chi的设计的主要考虑因素包括:项目结构,可维护性,标准的http处理程序(仅stdlib),开发人员的工作效率以及将大型系统分解为许多小部分的过程。核心路由器github.com/go-chi/chi非常小(小于1000 LOC),但还包括一些有用的/可选的子包:Middlewarerenderdocgen

go-chi特征

  • 轻巧 -chi路由器的时钟约为1000 LOC
  • 快速 -是,请参阅基准
  • 100%与net / http兼容 -在生态系统中使用也与以下版本兼容的任何http或中间件pkgnet/http
  • 专为模块化/组合式API设计 -中间件,嵌入式中间件,路由组和子路由器安装
  • 上下文控制 -基于新context程序包,提供价值链,取消和超时
  • 稳健 -在Pressly,CloudFlare,Heroku,99Designs和许多其他公司中进行生产(请参阅讨论)
  • 文档生成 - docgen自动将路由文档从您的源生成为JSON或Markdown
  • 没有外部依赖 -普通ol st Golib + net / http

Render工具包源码解析

GitHub地址:https://github.com/go-chi/render

这个渲染工具包很小,适合阅读。

Render介绍

render软件包有助于管理HTTP请求/响应有效负载。

每个设计良好,健壮和可维护的Web Service / REST API也都需要定义明确的请求和响应有效负载。请求和响应有效负载与端点处理程序一起构成服务器与调用它的客户端之间的协定。

通常,在REST API应用程序中,您将拥有保存较低级别运行时应用程序状态的数据模型(对象/结构),有时您需要在响应客户端之前组装,修饰,隐藏或转换表示形式。该服务器的输出(响应有效负载)结构也可能是服务器上另一个处理程序的输入结构。

这就是其中的render用处-提供一些简单的帮助程序和界面,以提供用于管理有效载荷编码和解码的简单模式。

还可以将它与一些用于响应内容类型和解析请求正文的助手结合在一起。

Render方法

Render方法源代码:

Render源代码.png

  • 步骤1:结构体中实现Render方法去兼容Render渲染

go-chi的render使用-结构体中实现Render方法去兼容.png

  • 步骤2:使用Render

go-chi的render使用.png

RenderList方法

官方注释说明:RenderList呈现有效负载的一部分并响应客户端请求。

简单理解,就是Render时渲染对象的,RenderList是渲染数组的。

  • 步骤1:结构体中实现Render方法去兼容Render渲染

go-chi的renderList使用-结构体中实现Render方法去兼容.png

  • 步骤2:使用RenderList

    因为RenderList方法需要的是一个Renderer数组,看源代码可以知道,它跟Render方法的区别就是传入的是数组,多了一个for循环。

    RenderList源代码:

RenderList源代码.png

开始使用:

  var frontOfficeProductOfferList []render.Renderer
  for _, front := range frontOfficeProductOffers {
      frontOfficeProductOfferList = append(frontOfficeProductOfferList, &front)
  }

  render.Status(r, http.StatusOK)
  render.RenderList(w, r, frontOfficeProductOfferList)

go-chi的renderList使用.png

渲染结果(emm...打码了。。。知道是渲染结果就可以了,数据是啥可以不用关心。。。):

go-chi的renderList使用-渲染结果.png

Render包总结

其实RenderRenderList方法可以换做w.Write()也一样可以实现,因为Render包底层就是最终用的w.Write()实现,但是Render包里面渲染数据更到位。

核心部分:

最根本的三个,无非就是响应结果的类型、响应结果的状态码、响应结果的数据。

// 响应结果的类型
w.Header().Set("Content-Type", "application/json; charset=utf-8")

// 响应结果的状态码
w.WriteHeader(status)

// 响应结果的数据
w.Write(bodyBytes)

在这里会获取传递的值的类型,将数据切片,然后获取请求支持的格式,最后将传入数据的根据请求支持的格式渲染响应,也就是返回数据。

切片、获取传入数据类型、请求支持的类型:

Render包的核心.png

来看一下最后一个switch的条件,也就是GetAcceptedContentType方法,它获取到了类型就直接按照指定格式返回。

目前如果使用RenderRenderList

render.Render()
render.RenderList()

那么就只有两种返回类型结果,一个是XML,一个是JSON类型,默认是返回JSON类型。

但是,如果不使用这两种的话,也可以直接调用方法进行渲染:

目前responder有PlainText、Data、HTML、JSON、XML、NoContent、channelEventStream、channelIntoSlice这些渲染方法。

Render包的渲染方法.png

GetAcceptedContentType获取请求支持的类型:

Render包-获取请求支持的类型-2.png

GetContentType方法就是获取请求的类型:

Render包-获取请求支持的类型-1.png

再来看一下JSON方法以及XML方法:

  • JSON方法:

Render包-最根本的方法.png

  • XML方法:

Render包-XMl方法.png

本文目录