fb
WSO2 Enterprise Integrator 4 minuten

WSO2 EI / WSO2 ESB JSON Object support

Wouter-van-Wijngaarden.jpg
Wouter van Wijngaarden
Integration Consultant
Send or receive messages scaled 1
Scroll

Send or receive messagesIn de WSO2 EI- en WSO2 ESB-producten kan het zijn dat je tegen de situatie aanloopt dat je JSON berichten zou willen kunnen ontvangen of verzenden. Omdat ik recent met de functionaliteit aan het werk was, wilde ik een blog over dit onderwerp schrijven. In de onderstaande voorbeelden gebruiken we de volgende flow:

Inbound-outbound message flow JSON WSO2 EIWSO2ESB

Als het gaat om de message context in de WSO2 EI/ESB-producten wordt alles als XML verwerkt, wat gevolgen heeft voor de verwerking van JSON-objecten. Gelukkig zijn er een aantal makkelijke manieren om in de bus van JSON support gebruik te maken. In deze blog hebben we het over hoe deze producten JSON-objecten verwerken.

WSO2 banner

Voorbeeld setup

Ik heb voor dit voorbeeld in de EI een basis API-definitie gemaakt die in staat is om POST requests op http://localhost:8280/transform/example1 te ontvangen en ik ga postman gebruiken om zowel JSON- als XML-berichten naar dit eindpunt te sturen.

Example API
<api name="testAPI" context="/transform">

   <resource methods="POST" uri-template="/example1">
      <inSequence>
         <log level="full"/>
         <respond/>
      </inSequence>
      <outSequence/>
      <faultSequence/>
   </resource>
</api>
Example 1 input message
{
    "testData": {
        "testValue1": "value",
        "testValue2": "value"
    }
}

Als het de Bus in gestuurd wordt ziet het er uit zoals je hieronder kunt zien. Je ziet dat we hier een element hebben dat niet gedefinieerd was in onze originele berichttekst: een “jsonObject”. De bus gebruikt dit om te specificeren dat het volgende XML-element een JSON-object is als het omgezet moet worden naar JSON-formaat. De uitzondering op deze regel zien we wanneer het elementen zijn die alleen maar waarden bevatten, in plaats van elementen die elementen bevatten. In dat geval wordt er een naamloos object gemaakt dat de bewuste waarde bevat.

Example 1 message inside the bus
<jsonObject>

      <testData>
           <testValue1>value</testValue1>
           <testValue2>value</testValue2>
      </testData>
</jsonObject>

Laten we nu eens kijken naar wat de API teruggeeft. Hij reageert zoals verwacht op ons originele bericht in JSON en het originele formaat klopt nog steeds.

Example 1 result message
{

    "testData": {
        "testValue1": "value",
        "testValue2": "value"
    }
}

Maar wat als ik het inkomende XML-bericht wil omzetten in een uitgaand JSON-bericht?

Example 2 input message
<testData>
     <testValue1>value</testValue1>
     <testValue2>value</testValue2>
</testData>

Dit ziet er binnen de bus natuurlijk precies hetzelfde uit, omdat we al vastgesteld hadden dat alle berichten als XML verwerkt worden. Maar omdat we de return message in JSON-formaat willen hebben, zullen we voor de <respond/> mediator een regel aan de API insequence toe moeten voegen.

<property name="messageType" scope="axis2" type="STRING" value="application/json" />

Deze regel bepaalt de generic properties die beschikbaar zijn in het WSO2 EI/ESB-product, het zorgt ervoor dat het berichttype ingesteld wordt op application/json. Hierdoor geeft de bus een JSON-bericht als respons terug. Meer informatie over generic properties is in de WSO2 documentatie te vinden.

Example 2 output message
{
    "testData": {
        "testValue1": "value",
        "testValue2": "value"
    }
}

We hebben nu gezien dat we het berichttype kunnen veranderen, omdat de bus de verandering van XML naar JSON prima verwerkt. Maar wat doet de <jsonObject> tag dan in het eerste voorbeeld? Dat heeft te maken met hoe JSON door het product verwerkt wordt. Als er een bericht binnenkomt dat de JSON content type http-header bevat, dan verandert het product het omringende object naar een XML-representatie van dat object. Dus een <jsonObject> en converteert het opnieuw in outflow. Om dezelfde reden werkt het dus niet om het bericht in XML-vorm te sturen met gewoon een <jsonObject> element om de inhoud heen. De bus interpreteert het als XML, omdat het content type dat in eerste instantie aan de bus gegeven wordt XML is. Daardoor blijft het <jsonObject> element een element en zorgt het er dus niet voor dat het bericht in een JSON-bericht wordt omgezet.

Example 3 input message
<jsonObject>

    <testData>
       <testValue1>value</testValue1>
       <testValue2>value</testValue2>
   </testData>
</jsonObject>

Dit bericht wordt gewoon als XML geïnterpreteerd.

Wat gebeurt er als we het bovenstaande bericht gebruiken en ook de property mediator voor messageType instellen? De Bus zal opmerken dat het <jsonObject> element alleen nodig is in de XML-notatie en verwijdert het bij de conversie naar JSON.

Example 3 output message
{
    "testData": {
        "testValue1": "value",
        "testValue2": "value"
    }
}

Dit dekt de basis wat betreft de verwerking van JSON-objecten in de WSO2 EI- en ESB- producten. In deel 2 van deze blog ga ik het hebben over de manier waarop JSON arrays verwerkt worden en hoe je een XSLT-transformatie kunt gebruiken om deze waar nodig makkelijk te maken. Voor meer informatie over JSON support in WSO2 EI/ESB kun je de WSO2 documentatie raadplegen of hieronder een reactie achterlaten. Ik help je graag.