go-chi框架的子包render源代码解析
地址
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),但还包括一些有用的/可选的子包:Middleware,render和docgen。
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
方法源代码:
- 步骤1:结构体中实现Render方法去兼容Render渲染
- 步骤2:使用Render
RenderList方法
官方注释说明:RenderList呈现有效负载的一部分并响应客户端请求。
简单理解,就是Render时渲染对象的,RenderList是渲染数组的。
- 步骤1:结构体中实现Render方法去兼容Render渲染
步骤2:使用RenderList
因为
RenderList
方法需要的是一个Renderer
数组,看源代码可以知道,它跟Render
方法的区别就是传入的是数组,多了一个for循环。RenderList
源代码:
开始使用:
var frontOfficeProductOfferList []render.Renderer
for _, front := range frontOfficeProductOffers {
frontOfficeProductOfferList = append(frontOfficeProductOfferList, &front)
}
render.Status(r, http.StatusOK)
render.RenderList(w, r, frontOfficeProductOfferList)
渲染结果(emm...打码了。。。知道是渲染结果就可以了,数据是啥可以不用关心。。。):
Render包总结
其实Render
、RenderList
方法可以换做w.Write()
也一样可以实现,因为Render包底层就是最终用的w.Write()
实现,但是Render包里面渲染数据更到位。
核心部分:
最根本的三个,无非就是响应结果的类型、响应结果的状态码、响应结果的数据。
// 响应结果的类型
w.Header().Set("Content-Type", "application/json; charset=utf-8")
// 响应结果的状态码
w.WriteHeader(status)
// 响应结果的数据
w.Write(bodyBytes)
在这里会获取传递的值的类型,将数据切片,然后获取请求支持的格式,最后将传入数据的根据请求支持的格式渲染响应,也就是返回数据。
切片、获取传入数据类型、请求支持的类型:
来看一下最后一个switch的条件,也就是GetAcceptedContentType
方法,它获取到了类型就直接按照指定格式返回。
目前如果使用Render
、RenderList
render.Render()
render.RenderList()
那么就只有两种返回类型结果,一个是XML,一个是JSON类型,默认是返回JSON类型。
但是,如果不使用这两种的话,也可以直接调用方法进行渲染:
目前responder有PlainText、Data、HTML、JSON、XML、NoContent、channelEventStream、channelIntoSlice这些渲染方法。
GetAcceptedContentType
获取请求支持的类型:
GetContentType
方法就是获取请求的类型:
再来看一下JSON
方法以及XML
方法:
- JSON方法:
- XML方法:
- 本文标签: Golang go-chi
- 本文链接: http://www.lzhpo.com/article/140
- 版权声明: 本文由lzhpo原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权