2017-08-31 2 views
1

Ich implementiere eine API in WSO2 ESB 5.0, die einen POST mit einem XML-Body akzeptieren soll und ihn dann an einen anderen Webservice mit einem JSON-Body weiterleiten soll, der den ursprünglichen XML-Body enthält ein AttributWSO2 ESB: Ursprüngliche XML-Struktur in JSON-Nutzdaten einfügen

Beispiel:

ich folgenden Körper meiner ESB API schreiben:

<?xml version="1.0" encoding="utf-8"?> 
<workorder id="foobar"> 
    <foo/> 
</workorder> 

Ich erwarte, dass so etwas wie das meine Webservice gepostet folgenden werden:

{ 
    "key1": "value1", 
    "key2": "value2", 
    "input" : "<?xml version=\"1.0\" encoding=\"utf-8\"?><workorder id=\"foobar\"><foo/></workorder>" 
} 

Vorerst durch inSequence sieht so aus:

<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> 

Es gibt diese:

{ 
    "key1": "value1", 
    "key2": "value2", 
    "input" : "[<workorder id="foobar"><foo/></workorder>]" 
} 

ich keine Ahnung, wie zu verfahren. Alles, was ich will, ist, den rohen Text, den ich gepostet habe, abzurufen (und doppelte Anführungszeichen zu entkommen, damit er in JSON eingefügt werden kann).

Antwort

0

landete ich ein Skript Vermittler mit zu handhaben:

<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> 

Aus irgendeinem Grund, den JSON.stringify Ruf sowie die endgültige „Set Content-Type“ erforderlich sind.

Als Bonus musste ich auch das Gegenteil von dem tun, was ich hier gefragt habe: Extrahieren eines XML aus einem JSON-Payload-Attribut und Rückgabe als korrektes XML-Objekt. Der relevante Teil der Sequenz war:

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