ctx.text()是最稳妥的选择,因其自动设置content-type: text/plain; charset=utf-8且原样输出不转义;误用ctx.writestring()或ctx.json()会导致解析异常或格式错误。

直接用 ctx.Text(),别用 ctx.JSON() 或 ctx.HTML() —— 否则浏览器会解析成 JSON 或 HTML,不是你想要的纯文本。
为什么 ctx.Text() 是最稳妥的选择
Iris 的 ctx.Text() 会自动设置 Content-Type: text/plain; charset=utf-8,并把传入内容原样写入响应体。它不序列化、不转义、不模板渲染,就是“你给什么,它发什么”。
常见错误是误用 ctx.WriteString():它不会设 Content-Type,某些客户端(比如 Postman 或 curl)可能按 text/html 解析,导致换行符显示为 <br> 或乱码;ctx.JSON() 则强制加双引号、转义特殊字符,根本不是纯文本。
-
ctx.Text("OK")→ 响应体是OK,Header 含Content-Type: text/plain; charset=utf-8 -
ctx.WriteString("OK")→ 响应体是OK,但 Header 没有 Content-Type,依赖客户端默认行为 -
ctx.JSON("OK")→ 响应体是"OK"(带引号),Content-Type 是application/json
返回带状态码或自定义 Header 的纯文本
如果需要非 200 状态码(比如 404、503),或加额外 Header(如 X-Rate-Limit),不能只靠 ctx.Text(),得先调 ctx.StatusCode() 和 ctx.Header():
app.Get("/health", func(ctx iris.Context) {
if !isDBHealthy() {
ctx.StatusCode(503)
ctx.Header("X-Health-Reason", "db-unavailable")
ctx.Text("DB offline")
return
}
ctx.Text("OK")
})
注意顺序:StatusCode() 和 Header() 必须在 Text() 之前调用,否则会被忽略(Iris 写响应头的时机在首次写响应体前)。
返回大段文本或文件内容时的注意事项
用 ctx.Text() 返回几 KB 以内内容没问题;但若读取日志文件、导出 CSV 或拼接千行文本,直接 ctx.Text(string(bytes)) 会触发一次内存拷贝([]byte → string),且 GC 压力大。
更高效的做法是用 ctx.ResponseWriter().Write() 直接写字节:
app.Get("/log/latest", func(ctx iris.Context) {
data, _ := os.ReadFile("/var/log/app.log")
ctx.ContentType("text/plain; charset=utf-8")
ctx.ResponseWriter().Write(data) // 零拷贝,不转 string
})
这时要手动调 ctx.ContentType(),因为 Write() 不自动设头;另外确保 data 是 UTF-8 编码,否则浏览器可能乱码。
最容易被忽略的是:Iris 默认对 text/plain 响应不启用 gzip,如果纯文本体积 >1KB 且带宽敏感,得自己配中间件或用 ctx.CompressWriter() 显式开启压缩——这不是 Text() 的责任,但线上常因此多出 60% 流量。











