最安全的纯文本响应方式是c.sendstring(),它自动设置content-type为text/plain; charset=utf-8,不加换行缩进或bom,且必须显式return以避免后续响应覆盖。

直接用 c.SendString() 返回纯文本最安全
它会自动设置 Content-Type: text/plain; charset=utf-8,且不加换行、缩进或 BOM,适合返回简单提示、调试信息或 API 的 plain-text 响应。别用 c.Send() —— 它只是把字节原样写入响应体,不设 header,客户端可能解析成乱码。
- 必须显式
return,否则后续代码可能覆盖响应:比如写了c.SendString("ok")却没return,后面又调c.JSON(...),最终发出去的是 JSON - 如果字符串含中文,确保源文件保存为 UTF-8 编码(Go 源码默认就是),
c.SendString()不会二次编码 - 不要在中间件里只调
c.SendString()就结束——得配合return,否则请求还会往下走
c.Status() 和 c.SendString() 要配对用才可控
单独调 c.Status(404) 不会发送响应,它只改状态码;真正发内容靠 SendString、JSON 等方法。常见错误是只写 c.Status(404) 就以为返回了 404 页面,结果浏览器收到 200 + 空体。
- 正确写法:
c.Status(404).SendString("Not Found") - 链式调用中,
Status()必须在SendString()前,否则无效(后者会重置状态码) - 如果想返回带 HTML 标签的文本(如
<h1>Error</h1>),仍用SendString(),但需手动设 header:c.Set("Content-Type", "text/html; charset=utf-8")
别误用 c.Send() 或 c.Body() 模拟响应
c.Send([]byte("...")) 是底层裸写,不设任何 header,容易导致前端解析失败;c.Body() 是读请求体的方法,不是响应函数——名字像但完全相反,写错会编译报错或逻辑错位。
- 看到 “undefined field Body” 错误?大概率是把
c.Body()当成响应方法用了 -
c.Send()适合极少数需要精确控制响应字节的场景(比如返回二进制文件头),日常文本响应请坚持用SendString() - Fiber 的
Ctx对象在请求间复用,千万别把c.SendString()的结果存到全局变量或 goroutine 中长期引用
SendString),记得链式调用时顺序和 return。最容易被忽略的是——所有响应方法都**不自动终止流程**,少一个 return,就可能多发一次响应。











