c.String 和 c.XML 易误用:c.String 默认 charset=ISO-8859-1 导致中文乱码,需显式设 UTF-8;c.XML 仅识别 xml: 标签,字段名大小写敏感,空值静默跳过,406 错误源于 Accept 头不匹配,应使用 c.Negotiate 或手动判断。

c.String 和 c.XML 是 Echo 中最常被误用的两个响应方法——它们不自动设置 Content-Type,也不做结构体字段映射,但很多人直接拿 c.JSON 的写法套用,结果返回乱码或 406 错误。
为什么 c.String 返回中文是乱码?
默认情况下 c.String 发送的是 text/plain; charset=ISO-8859-1,浏览器不会按 UTF-8 解析。不是 Go 编码问题,是 HTTP 响应头没对。
- 显式指定 UTF-8:用
c.String(http.StatusOK, "你好")前加c.Response().Header().Set("Content-Type", "text/plain; charset=utf-8") - 更稳妥的做法:改用
c.Render+ 自定义模板,或直接走c.JSON(它自动设application/json; charset=utf-8) - 注意:
echo.New()默认不启用 Gzip,大文本字符串建议自行压缩或换流式响应
c.XML 要求 struct 字段必须带 xml 标签
c.XML 不会读 json: 或 form: 标签,只认 xml:。漏写或拼错标签名,字段就消失,且无报错。
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
- 正确写法:
Name string `xml:"name"`,不是`xml:"Name"`(首字母大小写影响 XML 元素名生成) - 根节点名默认是 struct 类型名(如
User{}→),想自定义需用xml:"user,any"或嵌套 struct - 空字段默认被忽略;要强制输出空标签,加
omitempty反向逻辑:用xml:",omitempty"才跳过,不加就始终输出
XML 响应常见 406 Not Acceptable 错误
不是代码写错了,而是客户端请求头里 Accept: application/json,而你硬返回 XML,Echo 默认不做协商(unlike c.Negotiate)。
- 检查请求头:
curl -H "Accept: application/xml" http://localhost:8080/api - 服务端兼容写法:用
c.Negotiate(http.StatusOK, data, echo.MIMEApplicationXML, echo.MIMEApplicationJSON) - 或手动判断:
if strings.Contains(c.Request().Header.Get("Accept"), "xml") { c.XML(...) }
真正容易被忽略的是:XML 输出时,如果 struct 字段是 nil 指针或空 slice,c.XML 会静默跳过该字段——不像 JSON 那样可配 omitempty 行为,它没这个开关。调试时得打日志看实际传入的 struct 值,而不是只信返回体。










