菜单

其他响应格式

相关源文件

本文档介绍了 Gin 中除了标准的 JSON 和 HTML 模板之外的各种响应格式。Gin 提供了一套丰富的渲染器实现,让您可以轻松地以 XML、YAML、TOML、Protocol Buffers 等不同格式输出数据。有关 JSON 响应的信息,请参阅 JSON 响应。有关 HTML 模板的详细信息,请参阅 HTML 模板

响应格式概述

Gin 通过 render 包中定义的 Render 接口实现了各种响应格式。该接口要求实现两个方法。

来源: render/render.go9-15

下图展示了 Gin 支持的响应格式

来源: render/render.go17-34

XML 响应

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 (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 响应

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 (ProtoBuf)

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 (MsgPack)

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(在 JSON 响应 中介绍)之外,Gin 还提供了几种专门的 JSON 渲染器。

AsciiJSON

AsciiJSON 确保 JSON 输出中的所有非 ASCII 字符都得到转义,这对于某些处理 UTF-8 不太好的客户端可能很有用。

这将渲染 JSON,其中所有非 ASCII 字符都经过转义(例如,“GO\u8bed\u8a00”)。

来源: render/json.go153-177 以及 render/render_test.go210-229

PureJSON

PureJSON 渲染 JSON 而不转义 HTML 字符,这与默认的 JSON 行为相反。

这将渲染 JSON,其中 HTML 未转义(例如,{"html":"<b>Hello</b>"})。

来源: render/json.go179-190 以及 render/render_test.go239-248

JSONP 响应

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

高级响应渲染(使用 Reader)

对于流式数据或高级响应处理,Gin 提供了 Reader 渲染器,它接受一个 io.Reader

基本用法

这会将数据从提供的 reader 流式传输到客户端,并带有自定义标头。

实现细节

Reader 渲染器提供了流式传输数据或高效服务文件的灵活性。

来源: render/render_test.go537-558 以及 render/render_test.go560-581

响应格式选择表

下表总结了 Gin 中可用的响应格式。

格式Context 方法Content-Type使用场景
XMLc.XML()application/xml; charset=utf-8XML 格式的 API 响应
YAMLc.YAML()application/yaml; charset=utf-8配置文件,人类可读的响应
TOMLc.TOML()application/toml; charset=utf-8配置响应
ProtoBufc.ProtoBuf()application/x-protobuf高效的二进制数据交换
MsgPackc.MsgPack()application/msgpack; charset=utf-8类似于 JSON 的紧凑二进制格式
文本c.String()text/plain; charset=utf-8简单的文本响应
原始数据c.Data()自定义内容类型二进制数据、图像、文件
AsciiJSONc.AsciiJSON()application/json包含已转义非 ASCII 字符的 JSON
PureJSONc.PureJSON()application/json; charset=utf-8包含未转义 HTML 的 JSON
JSONPc.JSONP()application/javascript; charset=utf-8跨域 JSON 请求
读取器c.DataFromReader()自定义内容类型流式响应、大文件

来源: binding/binding_nomsgpack.go11-24

内容协商

Gin 不会根据 Accept 头部自动进行内容协商。您需要在处理程序中显式选择响应格式。要实现内容协商,您可以检查 Accept 头部的值并渲染适当的格式。