fb
WSO2 Enterprise Integrator 4 Minuten

WSO2 EI / WSO2 ESB JSON Objekt-Support

Wouter van Wijngaarden
Wouter van Wijngaarden
Integration Consultant
Send or receive messages scaled 1
Scrollen

Send or receive messagesBei den WSO2 EI- und WSO2 ESB-Produkten kann es vorkommen, dass Sie JSON-Nachrichten entweder empfangen oder senden möchten. Da ich vor kurzem einige Erfahrungen mit dieser Funktionalität gemacht habe, wollte ich einen Blog über dieses Thema schreiben. Bei den Beispielen in diesem Blog werde ich den folgenden Ablauf verwenden:

Inbound-outbound message flow JSON WSO2 EIWSO2ESB

Innerhalb des Nachrichtenkontexts des WSO2 EI/ESB-Produkts wird alles als XML gehandhabt, was sich auf die Art und Weise auswirkt, wie JSON verarbeitet wird. Zum Glück gibt es ein paar einfache Möglichkeiten, die JSON-Unterstützung innerhalb des Datenbusses zu nutzen. Dieser Blog befasst sich damit, wie das Produkt JSON-Objekte verarbeitet.

WSO2 banner

Beispiel für die Einrichtung

Für das Beispiel habe ich eine grundlegende API-Definition auf dem EI-Produkt erstellt, die in der Lage ist, POST-Anfragen auf http://localhost:8280/transform/example1 zu empfangen, und ich werde Postman  verwenden, um entweder JSON- oder XML-Nachrichten an diesen Endpunkt zu senden. 

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

Wenn es in den Bus gesendet wird, sieht es wie unten aus. Wie Sie hier sehen können, haben wir ein Element drin, das nicht in unserem ursprünglichen Nachrichtentext definiert war, nämlich „jsonObject“. Damit gibt der Bus an, dass das nächste XML-Element ein JSON-Objekt ist, wenn es in das JSON-Format konvertiert wird. Eine Ausnahme von dieser Regel ist, wenn es nur Elemente mit Werten darin gibt, anstatt Elemente, die Elemente enthalten. In dem Fall wird ein namenloses Objekt erstellt, das den Wert beinhaltet. 

Example 1 message inside the bus
<jsonObject>

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

Betrachten wir nun, was von der API zurückgegeben wird. Wie erwartet wird unsere ursprüngliche Nachricht in JSON zurückgegeben und das ursprüngliche Format ist noch intakt. 

Example 1 result message
{

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

Aber was ist, wenn ich die eingehende XML-Nachricht in eine ausgehende JSON-Nachricht konvertieren möchte?

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

Dies wird natürlich innerhalb des Datenbusses genau so aussehen, wie wir es eingerichtet haben, dass alle Nachrichten als XML verarbeitet werden. Da wir aber die Ausgangsnachricht im JSON-Format erhalten wollen, müssen wir eine Zeile in der API-Sequenz vor dem <respond/>-Mediator hinzufügen.

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

In dieser Zeile wird eine der generischen Eigenschaften angegeben, die im WSO2 EI/ESB-Produkt verfügbar sind. Sie veranlasst, dass der Nachrichtentyp auf application/json gesetzt wird, was dazu führt, dass der Bus eine JSON-Nachricht als Antwort zurückgibt. Mehr Informationen über generische Eigenschaften finden Sie in der WSO2-Dokumentation.

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

Jetzt haben wir gesehen, dass, wenn wir den Nachrichtentyp ändern, der Bus die Umwandlung von XML in JSON sehr gut verarbeiten kann. Was bewirkt nun das <jsonObject> Tag im ersten Beispiel? Dies hat mit der Art und Weise zu tun, wie JSON vom Produkt gehandhabt wird. Wenn eine eingehende Nachricht den JSON-Inhaltstyp http-Header enthält, konvertiert das Produkt das umgebende Objekt in eine XML-Darstellung dieses Objekts, d. h. <jsonObject>, und wandelt es dann während des Abflusses wieder um. Das ist auch der Grund, warum es nicht funktioniert, die Nachricht einfach in XML-Form mit dem <jsonObject>-Element um unseren Inhalt herum zu senden. Es wird vom Bus als XML interpretiert, denn der anfänglich an den Bus übergebene Inhaltstyp ist XML, so dass das <jsonObject>-Element ein Element bleibt und nicht dazu führt, dass die Nachricht zu einer JSON-Nachricht wird.

Example 3 input message
<jsonObject>

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

Diese Nachricht wird einfach als XML interpretiert.

Was geschieht nun, wenn wir die obige Nachricht verwenden, aber auch den Property Mediator verwenden, um den MessageType zu setzen? Dieser merkt, dass das <jsonObject>-Element nur in der XML-Notation vorhanden sein soll und entfernt es bei der JSON-Konvertierung.

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

Damit ist die grundlegende Handhabung von JSON-Objekten in den WSO2 EI- und ESB-Produkten abgedeckt. Im Teil 2 dieses Blogs werde ich darüber sprechen, wie JSON-Arrays gehandhabt werden und wie Sie eine XSLT-Transformation verwenden können, um diese bei Bedarf einfach zu erstellen. Für weitere Informationen zur JSON-Unterstützung des WSO2 EI/ESB-Produkts schauen Sie in die WSO2-Dokumentation oder hinterlassen Sie einen Kommentar unten. Ich helfe Ihnen gerne weiter.