Iris MVC 默认不支持 XML 解析和响应,需手动启用:请求头必须为 application/xml,结构体需显式声明 XML tag,响应前须调用 ctx.ContentType("application/xml") 并用 ctx.XML() 输出。

Iris 的 MVC 默认不支持 XML 解析和响应,必须显式启用并手动处理;否则 ctx.ReadXML 会返回 "unsupported media type",ctx.XML 会输出空或 panic。
为什么 Controller 方法接收不到 XML 请求体?
Iris 的 MVC 层不会自动注册 XML 解析器,即使你用 ctx.ReadXML(&v),底层 context.Request().Body 也未被识别为 application/xml 类型。框架默认只启用 JSON 和表单解析。
- 必须在启动前调用
app.RegisterView或配置iris.WithoutVersionChecker不相关,真正起作用的是app.Configure(iris.WithRequestBodyDecoder(...))—— 但 Iris 实际上不提供内置 XML decoder 注册点 - 正确做法是:在
main()中用app.UseRouter或全局中间件预处理 XML 内容类型,并确保请求头Content-Type: application/xml存在且规范(不能是text/xml) - 若前端发的是
text/xml,Iris 默认忽略,需手动读取原始 body:body, _ := ctx.ReadAll(),再用xml.Unmarshal(body, &v)
如何让 Controller 正确解析 XML 请求?
不要依赖 MVC 自动绑定,Iris 的 Bind 机制对 XML 支持极弱,推荐手动解码。
- 在 Controller 方法中,直接调用
ctx.ReadXML(&req)—— 前提是已确认请求头Content-Type为application/xml - 定义结构体时,XML tag 必须显式声明,例如:
type User struct { Name string `xml:"name"` ID int64 `xml:"id"` };没有 tag 会导致字段全零值 - 若 XML 包含命名空间(如
),标准xml包无法自动跳过,需用第三方库如github.com/clbanning/x2j或预清洗 body - 错误处理要主动检查:
if err := ctx.ReadXML(&req); err != nil { panic(&BizError{Code: 40003, Msg: "XML 格式错误"}) }
怎么返回标准 XML 响应而不是 JSON?
ctx.XML() 是唯一安全出口,但有三个关键限制。
- 它不会自动设置
Content-Type: application/xml,必须前置调用ctx.ContentType("application/xml"),否则客户端可能当 text/html 解析 - 返回结构体时,XML tag 缺失会导致字段被忽略 —— 即使字段是公开的,
xml:"-"或无 tag 都不会出现在输出中 - 不能混用
ctx.JSON()和ctx.XML()在同一 handler 中,因为ctx.StatusCode()不会重置 content-type,后续XML()可能被覆盖为 JSON 的 mime - 示例写法:
ctx.ContentType("application/xml") ctx.XML(User{ID: 123, Name: "Alice"})
容易被忽略的兼容性细节
XML 解析在 Iris 中不是一等公民,很多看似合理的写法实际无效。
-
BeforeActivation里注册的路由不改变解析行为,XML 支持完全由中间件和 context 方法控制 - Iris v12.2.5 源码中
context.ReadXML底层仍走bytes.NewReader+xml.Decode,不缓存、不复用 buffer,高频 XML 请求下 GC 压力比 JSON 明显更高 - 如果同时支持 JSON 和 XML,别用
ctx.UnmarshalBody—— 它只认application/json,对 XML 直接返回ErrUnknownContentType - 测试时 curl 要加 header:
curl -H "Content-Type: application/xml" -d ' ' http://localhost:8080/user1 Bob











