RenderText 默认返回纯文本,设 Content-Type: text/plain; charset=utf-8 和状态码 200,不走模板、不序列化结构体,仅将输入值转字符串输出;传非字符串时调用.String()或fmt.Sprint()。

RenderText 返回纯文本的默认行为
RenderText 是 Revel 内置最轻量的响应方法,它不走模板、不序列化结构体,只把传入的任意值转成字符串后写入响应体,并设 Content-Type: text/plain; charset=utf-8 和状态码 200。它适合返回调试信息、API 状态提示、简单日志或 CLI 友好输出。
常见误用是以为它支持格式化参数(像 fmt.Sprintf),其实它不做任何插值 —— 传什么就写什么:
func (c App) Health() revel.Result {
return c.RenderText("OK") // ✅ 输出 "OK",无换行、无引号
}
如果传了非字符串类型,Revel 会调用其 .String() 方法(若实现)或 fmt.Sprint() 转换,比如 c.RenderText(42) 输出 "42",c.RenderText([]int{1,2}) 输出 "[1 2]"。
手动控制 Content-Type 和状态码
RenderText 默认的 text/plain 不适合所有场景。比如你要返回 CSV、TOML 或自定义协议文本,就得覆盖响应头:
- 修改
Content-Type必须在return前设置:c.Response.ContentType = "text/csv; charset=utf-8" - 改状态码同理:
c.Response.Status = 401或c.Response.Status = http.StatusUnauthorized - 注意:一旦设置了
Status,后续不能再用RenderJson等其它Result,否则会 panic
典型例子:
func (c App) ExportCSV() revel.Result {
c.Response.ContentType = "text/csv; charset=utf-8"
c.Response.Header().Set("Content-Disposition", `attachment; filename="data.csv"`)
return c.RenderText("name,age\nalice,30\nbob,25")
}
避免中文乱码和换行截断
Revel 的 RenderText 默认用 UTF-8,但如果你从文件读取或拼接字符串时用了错误编码(如 GBK),或前端没声明 charset=utf-8,就会显示方块或问号。关键检查点:
- 确保源字符串本身是 UTF-8 编码(Go 字符串字面量天然 UTF-8)
- 不要手动加 BOM;Go 的
string不含 BOM,加了反而破坏兼容性 - 换行符统一用
\n(Unix 风格),Windows 的\r\n在某些终端或 HTTP 客户端里可能被双换行解析 - 若内容含敏感字符(如
&,),RenderText不做 HTML 转义 —— 这是优点也是风险,别把它当RenderTemplate用
和 RenderTemplate / RenderJson 混用的边界问题
一个 Action 方法只能返回一个 revel.Result。你不能先调 c.RenderText("a") 再调 c.RenderJson(b) —— 第二个会 panic,因为响应体已写入且 header 已发。
更隐蔽的坑是条件分支中混用不同 Result 类型但忘了提前 return:
func (c App) Handle() revel.Result {
if c.Params.Get("format") == "json" {
c.RenderJson(map[string]string{"ok": "true"}) // ❌ 缺少 return,继续执行下一行
}
return c.RenderText("plain fallback") // ✅ 但上面那行已触发 panic
}
正确写法必须显式 return:
if c.Params.Get("format") == "json" {
return c.RenderJson(map[string]string{"ok": "true"})
}
return c.RenderText("plain fallback")
这个细节容易在快速迭代时漏掉,尤其当逻辑分支变多、中间插入日志或鉴权检查时。











