WSO2 EI向后端发送JSON数组负载格式异常求助
WSO2 EI 负载格式错误问题排查与解决
后端要求的负载格式为JSON数组:
[ { "data1": "value1" }, { "data2":"value2" } ]
你遇到的核心问题出在Payload Factory的用法上,以下是具体分析和解决方案:
问题根源
你的代码中,DataToPostJson已经是序列化完成的JSON数组字符串(例如[{"register":"xxx",...}]),但使用media-type="json"的Payload Factory时,组件会将这个字符串参数当作JSON的字符串值处理,最终生成的消息体是被引号包裹且转义的字符串(如"[{\"register\":\"xxx\",...}]"),而非后端需要的原生JSON数组格式。
解决方案
方案1:用Script Mediator直接设置JSON payload
替换原有的Payload Factory节点为以下代码,直接解析JSON字符串并设置为消息体:
<script language="js"><![CDATA[ // 解析JSON字符串为对象,直接设置为消息体 var payloadJson = JSON.parse(mc.getProperty("DataToPostJson")); mc.setPayloadJSON(payloadJson); ]]></script>
方案2:用Property Mediator直接设置MESSAGE属性
也可以通过设置MESSAGE属性直接覆盖消息体,同时确保messageType配置正确:
<property name="MESSAGE" expression="$ctx:DataToPostJson" scope="default" type="STRING"/> <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
额外验证步骤
- 检查日志中
DataToPostJson的输出,确认是正确的JSON数组格式,无多余引号或转义字符。 - 启用WSO2 EI的Wire日志,查看发送到后端的实际请求内容:
- 修改
repository/conf/log4j2.properties,添加配置:logger.org.apache.synapse.transport.http.wire.name = WireLogger logger.org.apache.synapse.transport.http.wire.level = DEBUG logger.org.apache.synapse.transport.http.wire.additivity = false logger.org.apache.synapse.transport.http.wire.appenderRef.CARBON_CONSOLE.ref = CARBON_CONSOLE - 重启EI后,控制台会输出完整的请求/响应内容,可直接确认发送的负载格式是否符合后端要求。
- 修改
内容的提问来源于stack exchange,提问作者Aristide Etoumi
相关产品推荐
相关产品推荐

