响应输出:JSON/XML/YAML/String/HTML/Data 与状态码
本章解决什么问题:写接口本质是“给请求一个响应”。Gin 把常见输出格式都做成 *gin.Context 上的渲染方法,本章逐个过一遍,并说明状态码与 Content-Type 的规则。
状态码与 Content-Type
渲染方法的第一参数是 HTTP 状态码;渲染时框架自动设置对应的 Content-Type(如 JSON 为 application/json; charset=utf-8)。风格上建议每次都显式传状态码,读代码的人一眼能看懂。
JSON 一族
c.JSON 是最常用的输出:值可以是结构体、map 或 gin.H。注意 c.JSON 默认会对 HTML 字符做转义(如 < 变成 \u003c),需要原样输出时用 c.PureJSON:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
r := gin.Default()
r.GET("/user", func(c *gin.Context) {
c.JSON(http.StatusOK, User{ID: 1, Name: "gin"})
})
r.GET("/raw", func(c *gin.Context) {
c.PureJSON(200, gin.H{"html": "<b>raw</b>"})
})
r.Run(":8080")
}
想输出紧凑的 ASCII 转义用 c.AsciiJSON;想带缩进方便人读用 c.IndentedJSON。这些 API 的取舍在官方文档 gin-gonic.com 的渲染一节都有说明。
XML / YAML / String
调用形态与 JSON 完全一致:c.XML(200, data) 输出 application/xml,c.YAML(200, data) 输出 application/x-yaml,c.String(200, "fmt %s", v) 输出 text/plain 并支持格式化参数。输出 XML 时,结构体字段可用 xml tag 控制元素名。
HTML 与 Data
HTML 需要两步:先 r.LoadHTMLGlob("templates/*")(或 LoadHTMLFiles)加载模板,handler 里调 c.HTML(200, "index.tmpl", data),模板内用 {{.字段}} 取值。c.Data 则用于完全自定义的内容:c.Data(200, "application/octet-stream", 字节切片),适合导出文件、图片这类响应。
关键点
- 渲染方法第一参数是状态码,Content-Type 与基础响应头由框架设置。
- c.JSON 会转义 HTML 字符,原样输出用 c.PureJSON。
- 一个请求只写一次响应:需要分支输出时用 if/return 保证单一路径,避免多次渲染互相干扰。
小结
除 JSON 外,XML/YAML/String/HTML/Data 的调用规则同构,都是“状态码 + 数据”。下一章看两类特殊响应:重定向与静态资源。