我在WSO2 ESB 5.0中实现一个API,该API应该接受带有XML主体的POST,然后将其转发到另一个Web服务,其中JSON主体包含原始XML主体作为属性。
示例:
我将以下正文发布到我的ESB API:
<?xml version="1.0" encoding="utf-8"?>
<workorder id="foobar">
<foo/>
</workorder>
我希望将以下内容发布到我的网络服务中:
{
"key1": "value1",
"key2": "value2",
"input" : "<?xml version=\"1.0\" encoding=\"utf-8\"?><workorder id=\"foobar\"><foo/></workorder>"
}
现在通过inSequence看起来像:
<inSequence>
<property name="messageType" value="application/xml" scope="axis2"/>
<log level="full"/>
<enrich description="Store workorder">
<source type="body" clone="true"/>
<target type="property" property="SENT_WORKORDER"/>
</enrich>
<payloadFactory media-type="json" description="">
<format>{"key1": "value1", "key2": "value2", "input": "$ctx:SENT_WORKORDER"}</format>
<args/>
</payloadFactory>
<log level="full"/>
<property name="REST_URL_POSTFIX" value="/my/service" scope="axis2" type="STRING" description="Set URL"/>
<send>
<endpoint key="conf:/endpoints/my_endpoint"/>
</send>
</inSequence>
它返回:
{
"key1": "value1",
"key2": "value2",
"input" : "[<workorder id="foobar"><foo/></workorder>]"
}
我不知道如何继续。我想要的只是检索我发布的原始文本(并转义双引号,以便它可以包含在JSON中)。
答案 0 :(得分:0)
我最终使用脚本调解器来处理这个问题:
<inSequence>
<log level="full"/>
<script language="js"><![CDATA[
var log = mc.getServiceLog();
var payload = {"key1": "value1", "key2": "value2", "input": ""};
payload["input"] = mc.getPayloadXML().toString();
log.info("Built payload: " + JSON.stringify(payload));
mc.setPayloadJSON(JSON.stringify(payload));
]]></script>
<property name="REST_URL_POSTFIX" value="/my/service" scope="axis2" type="STRING" description="Set URL"/>
<property description="Set Content-Type" name="messageType" scope="axis2" type="STRING" value="application/json"/>
<send>
<endpoint key="conf:/endpoints/my_endpoint"/>
</send>
</inSequence>
出于某种原因,JSON.stringify
调用以及最终的“设置内容类型”是必需的。
作为奖励,我还需要执行与此处要求相反的操作:从JSON有效内容属性中提取XML并将其作为正确的XML对象返回。 序列的相关部分是:
<script language="js"><![CDATA[
var payload = mc.getPayloadJSON();
var report = payload.path.to.xml.attribute;
mc.setPayloadXML(XML(report));
]]></script>
<property description="Set Content-Type" name="messageType" scope="axis2" type="STRING" value="application/xml"/>