响应输出: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 的调用规则同构,都是“状态码 + 数据”。下一章看两类特殊响应:重定向与静态资源。

笔记加载中…