yii 2.0.52 默认不支持 xml 响应,需手动注册 xmlresponseformatter 并配置 contentnegotiator 行为,否则 accept: application/xml 会返回 json 或 406 错误。

Yii 2.0.52 默认不自动支持 XML 响应格式,但可以启用,关键在 ContentNegotiator 行为和 XmlResponseFormatter 的显式注册。
为什么请求 Accept: application/xml 却返回 JSON 或 406?
Yii 2.0 默认只注册了 JsonResponseFormatter,XmlResponseFormatter 虽存在但未启用。当客户端声明需要 XML,而框架没配好格式化器时,就会 fallback 到默认(通常是 JSON)或直接报 406 Not Acceptable。
常见错误现象:
- Postman 发送
Accept: application/xml,响应仍是 JSON 且状态码 200 - 用
curl -H "Accept: application/xml" ...得到空响应或 406 - 控制器返回数组,XML 格式始终不触发
怎么让 Yii 2.0.52 真正支持 XML 响应?
必须手动把 XmlResponseFormatter 加进 response 组件,并确保 ContentNegotiator 行为生效。
实操建议:
- 在
config/web.php的components下配置response:
'response' => [
'class' => 'yii\web\Response',
'formatters' => [
\yii\web\Response::FORMAT_XML => [
'class' => 'yii\web\XmlResponseFormatter',
'rootTag' => 'response', // 可选,自定义根节点
],
],
],
- 在控制器中启用内容协商行为(通常放在
behaviors()):
public function behaviors()
{
return [
'contentNegotiator' => [
'class' => 'yii\filters\ContentNegotiator',
'formats' => [
'application/json' => \yii\web\Response::FORMAT_JSON,
'application/xml' => \yii\web\Response::FORMAT_XML,
],
],
];
}
- 确保 action 返回的是数组或对象(不能是字符串或已渲染的 HTML)
XmlResponseFormatter 的坑和限制
它不是万能 XML 生成器,对数据结构敏感,容易出错。
常见问题:
- 数组键名含非法 XML 字符(如空格、点号、开头数字)→ 报
Invalid argument supplied for foreach()或空白响应 - 嵌套过深或含递归引用 → 序列化失败,静默返回空
- 没有设置
rootTag且顶层是索引数组 → XML 无根节点,解析失败 - 不支持
DateTime对象直接序列化 → 需提前转成字符串
安全起见,建议只对简单关联数组启用 XML,例如:
return [
'status' => 'success',
'data' => ['id' => 123, 'name' => 'test'],
];
复杂结构或需定制命名空间、CDATA、属性等,就别硬扛 XmlResponseFormatter,改用视图渲染或第三方库更稳。











