本文档介绍了 Gin 中除了标准的 JSON 和 HTML 模板之外的各种响应格式。Gin 提供了一套丰富的渲染器实现,让您可以轻松地以 XML、YAML、TOML、Protocol Buffers 等不同格式输出数据。有关 JSON 响应的信息,请参阅 JSON 响应。有关 HTML 模板的详细信息,请参阅 HTML 模板。
Gin 通过 render 包中定义的 Render 接口实现了各种响应格式。该接口要求实现两个方法。
下图展示了 Gin 支持的响应格式
Gin 通过 XML 结构体类型提供简单的 XML 渲染。
渲染 XML 响应
c.XML() 方法将 Content-Type 标头设置为 application/xml; charset=utf-8,并将提供的 marshalled 数据转换为 XML 格式。
render 包中的 XML 结构体实现了 Render 接口。
来源: render/render_test.go355-369
YAML (YAML Ain't Markup Language) 是一种人类可读的数据序列化格式。Gin 支持渲染 YAML 格式的响应。
渲染 YAML 响应
这将 Content-Type 标头设置为 application/yaml; charset=utf-8,并将数据 marshalled 为 YAML 格式。
YAML 渲染器在 render/render_test.go275-289 中进行了测试,该测试表明它正确地设置了内容类型并 marshalled 了数据。
来源: binding/binding_nomsgpack.go21-22
TOML (Tom's Obvious, Minimal Language) 是一种易于读写设计的配置文件格式。Gin 支持渲染 TOML 格式的响应。
渲染 TOML 响应
这会将 Content-Type 标头设置为 application/toml; charset=utf-8,并将数据 marshalled 为 TOML 格式。
TOML 渲染器在 render/render_test.go305-318 中进行了测试,该测试表明它正确地渲染了 TOML 数据。
来源: binding/binding_nomsgpack.go23
Protocol Buffers 是 Google 的一种语言中立、平台中立、可扩展的结构化数据序列化机制。Gin 支持渲染 Protocol Buffer 响应。
要渲染 Protocol Buffer 响应,您需要定义 protobuf 消息类型。
这会将 Content-Type 标头设置为 application/x-protobuf,并使用 Protocol Buffers marshalled 数据。
ProtoBuf 渲染器在 render/render_test.go327-346 中进行了测试,该测试表明它能够正确地 marshalled protocol buffer 消息。
来源: binding/binding_nomsgpack.go20
MessagePack 是一种高效的二进制序列化格式。它类似于 JSON,但更快、更小。当不使用 nomsgpack 构建标签构建时,Gin 支持渲染 MessagePack 响应。
渲染 MessagePack 响应
这会将 Content-Type 标头设置为 application/msgpack; charset=utf-8,并将数据编码为 MessagePack 格式。
MsgPack 渲染器在 render/msgpack.go 中定义,并且仅在未设置 nomsgpack 构建标签时可用。
来源: render/msgpack.go18-43 以及 render/render_msgpack_test.go22-44 中进行了测试。
对于简单的文本响应,Gin 提供了 String 渲染器。
渲染纯文本响应
这将渲染 "Hello world",并将 Content-Type 标头设置为 text/plain; charset=utf-8。
String 渲染器支持类似于 fmt.Sprintf 的格式字符串。
来源: render/render_test.go425-442
对于返回原始二进制数据或自定义内容类型,Gin 提供了 Data 渲染器。
这会发送原始字节以及指定的内容类型标头。
Data 渲染器只是将提供的字节写入响应,并带有指定的内容类型。
来源: render/render_test.go411-423
除了标准的 JSON(在 JSON 响应 中介绍)之外,Gin 还提供了几种专门的 JSON 渲染器。
AsciiJSON 确保 JSON 输出中的所有非 ASCII 字符都得到转义,这对于某些处理 UTF-8 不太好的客户端可能很有用。
这将渲染 JSON,其中所有非 ASCII 字符都经过转义(例如,“GO\u8bed\u8a00”)。
来源: render/json.go153-177 以及 render/render_test.go210-229
PureJSON 渲染 JSON 而不转义 HTML 字符,这与默认的 JSON 行为相反。
这将渲染 JSON,其中 HTML 未转义(例如,{"html":"<b>Hello</b>"})。
来源: render/json.go179-190 以及 render/render_test.go239-248
JSONP(带填充的 JSON)是一种从不同域中的服务器请求数据的技术,可以绕过同源策略限制。Gin 支持使用 JsonpJSON 渲染器进行 JSONP 响应。
对于名为“callbackFunction”的回调,这将渲染 callbackFunction({"foo":"bar"});,并将 Content-Type 标头设置为 application/javascript; charset=utf-8。
JSONP 渲染器将 JSON 数据包装在回调函数中。
来源: render/json.go33-37 以及 render/json.go115-146 以及 render/render_test.go113-139
对于流式数据或高级响应处理,Gin 提供了 Reader 渲染器,它接受一个 io.Reader。
这会将数据从提供的 reader 流式传输到客户端,并带有自定义标头。
Reader 渲染器提供了流式传输数据或高效服务文件的灵活性。
来源: render/render_test.go537-558 以及 render/render_test.go560-581
下表总结了 Gin 中可用的响应格式。
| 格式 | Context 方法 | Content-Type | 使用场景 |
|---|---|---|---|
| XML | c.XML() | application/xml; charset=utf-8 | XML 格式的 API 响应 |
| YAML | c.YAML() | application/yaml; charset=utf-8 | 配置文件,人类可读的响应 |
| TOML | c.TOML() | application/toml; charset=utf-8 | 配置响应 |
| ProtoBuf | c.ProtoBuf() | application/x-protobuf | 高效的二进制数据交换 |
| MsgPack | c.MsgPack() | application/msgpack; charset=utf-8 | 类似于 JSON 的紧凑二进制格式 |
| 文本 | c.String() | text/plain; charset=utf-8 | 简单的文本响应 |
| 原始数据 | c.Data() | 自定义内容类型 | 二进制数据、图像、文件 |
| AsciiJSON | c.AsciiJSON() | application/json | 包含已转义非 ASCII 字符的 JSON |
| PureJSON | c.PureJSON() | application/json; charset=utf-8 | 包含未转义 HTML 的 JSON |
| JSONP | c.JSONP() | application/javascript; charset=utf-8 | 跨域 JSON 请求 |
| 读取器 | c.DataFromReader() | 自定义内容类型 | 流式响应、大文件 |
来源: binding/binding_nomsgpack.go11-24
Gin 不会根据 Accept 头部自动进行内容协商。您需要在处理程序中显式选择响应格式。要实现内容协商,您可以检查 Accept 头部的值并渲染适当的格式。