如何用Dancer2::Plugin::REST返回XML?需保留JSON返回功能
解决Dancer2返回XML数据的服务器错误问题
你遇到的核心问题是:默认的Dancer2::Serializer::XML(也就是你配置里的xml: XML)只能处理字符串内容,没办法自动把Perl哈希结构转换成XML字符串。当你返回哈希时,序列化器没有完成转换工作,导致Dancer2的Response模块收到的还是哈希引用,违反了「内容必须是字符串」的类型约束,所以抛出了那个错误。
下面是具体的解决步骤:
1. 安装支持哈希转XML的依赖模块
你需要先安装一个能将Perl哈希直接转换成XML字符串的模块,推荐两个常用选项:
# 选项1:安装XML::Simple(使用广泛,配置灵活) cpanm XML::Simple # 选项2:安装XML::Hash::LX(轻量,语法简洁) cpanm XML::Hash::LX
2. 修改config.yml的序列化器配置
更新你的serializers配置段,让XML序列化器具备处理哈希的能力,以下是对应两种依赖的配置方案:
方案A:基于XML::Simple配置
serializers: json: JSON yml: YAML yaml: YAML dump: Dumper xml: class: XML options: serializer_class: 'XML::Simple' serializer_options: RootName: 'data' # 自定义XML根节点的名称 NoAttr: 1 # 只生成XML元素,不使用属性格式
方案B:使用XML::Hash::LX序列化器
如果安装的是XML::Hash::LX,可以直接指定这个序列化器类:
serializers: json: JSON yml: YAML yaml: YAML dump: Dumper xml: XML::Hash::LX
3. 验证功能
重启你的Dancer2应用后,执行测试命令:
curl https://<mydomain>/api/1.xml
此时应该会返回符合预期的XML响应,示例如下:
<data> <date>2019-09-01</date> <temperature>10</temperature> </data>
另外提个小细节:你之前的curl命令里用了Accept-Type,这是错误的HTTP头字段名,正确的应该是Accept。不过因为你用了.xml后缀,prepare_serializer_for_format会优先根据后缀选择序列化器,所以这个头不影响结果,但规范的写法是:
curl -H 'Accept: application/xml' https://<mydomain>/api/1.xml
内容的提问来源于stack exchange,提问作者user12138447
相关产品推荐
相关产品推荐

