WSO2 ESB:将原始XML主体包含在JSON有效负载

时间:2017-08-31 18:37:18

标签: wso2 wso2esb

我在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中)。

1 个答案:

答案 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"/>