Frage

Ich möchte einen Proxy bauen, der:
1. Rufen Sie Service an, die autorisieren und das Ergebnis OK oder scheitern (1. Service).
2. Wenn Ergebnis 'OK', rufen Sie einen Dienst an

Das Problem ist, wenn der 1. Dienst die Nachricht zurückgibt:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Body>
              <result>
                     <status>OK</status>
                     <message></message>
              </result>
       </soapenv:Body>
</soapenv:Envelope>

Und ich gebe "Filterung" bei Out -Sequenz. Hier ist der XML:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestProxy" transports="https,http" statistics="disable" trace="enable" startOnLoad="true">
   <target endpoint="AuthorizationService">
      <outSequence>
         <log level="full" />
         <filter xpath="/result/status='OK'">
            <then>
               <send>
                  <endpoint>
                     <address uri="http://192.168.1.140:8080/axis2/services/TaskService.TaskServiceHttpEndpoint/getTask" />
                  </endpoint>
               </send>
            </then>
            <else>
               <makefault version="soap11">
                  <code xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/" value="soap11Env:VersionMismatch" />
                  <reason value="1" />
                  <role>2</role>
                  <detail>3</detail>
               </makefault>
            </else>
         </filter>
         <log level="full" />
      </outSequence>
   </target>
</proxy>

Wenn ich meine Bewerbung ausführe, gibt die ESB immer die Nachricht:

16:08:59,358 [-] [HttpClientWorker-4] INFO Start : Log mediator 
16:08:59,361 [-] [HttpClientWorker-4] INFO To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:0bc33821-c4f1-448e-a7dc-be4194be8e99, Direction: response, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><result><status>OK</status><message></message></result></soapenv:Body></soapenv:Envelope> 
16:08:59,361 [-] [HttpClientWorker-4] INFO End : Log mediator 
16:08:59,361 [-] [HttpClientWorker-4] INFO Start : Filter mediator 
16:08:59,361 [-] [HttpClientWorker-4] INFO XPath expression : /result/status='OK' evaluates to false - executing the else path child mediators

Es scheint, als wäre die Bedingung der Filterung immer falsch.
Was ist die richtige Aussage für den XPath im Filter?

War es hilfreich?

Lösung

Es scheint, dass Sie möglicherweise einen falschen XPath -Ausdruck gegeben haben. Sie können keinen XPath und einen booleschen Ausdruck für den XPath -Wert angeben, dh es kann nicht "/result/status = 'ok'" sein, muss aber "/result/Status" sein. Nach Ihrer Sequenz würde es dann den Abschnitt danach abfeuern, wenn dieses Element vorhanden ist. Da Sie auch einen booleschen Zustand basierend auf dem XPath bewerten müssen, werde ich eine Alternative basierend auf dem Switch -Mediator vorstellen (dasselbe kann für den Filter durchgeführt werden, indem eine Eigenschaft festgelegt wird):

<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestProxy" transports="https,http" statistics="disable" trace="enable" startOnLoad="true">
   <target endpoint="AuthorizationService">
      <outSequence>
         <log level="full" />
         <switch source="//result/status">
            <case regex="OK">
               <send>
                  <endpoint>
                     <address uri="http://192.168.1.140:8080/axis2/services/TaskService.TaskServiceHttpEndpoint/getTask" />
                  </endpoint>
               </send>
            </case>
            <default>
               <makefault version="soap11">
                  <code xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/" value="soap11Env:VersionMismatch" />
                  <reason value="1" />
                  <role>2</role>
                  <detail>3</detail>
               </makefault>
            </default>
         </switch>
         <log level="full" />
      </outSequence>
   </target>
</proxy>

Andere Tipps

Ihre Proxy -Konfiguration sollte wie folgt aussehen

<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestProxy" transports="https,http"      statistics="disable" trace="enable" startOnLoad="true">
    <target endpoint="AuthorizationService">
      <outSequence>
         <log level="full"/>
         <filter source="/result/status" regex="ok">
            <then>
               <send>
                  <endpoint>
                     <address uri="http://192.168.1.140:8080/axis2/services/TaskService.TaskServiceHttpEndpoint/getTask"/>
                  </endpoint>
               </send>
            </then>
            <else>
               <makefault version="soap11">
                  <code xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/" value="soap11Env:VersionMismatch"/>
                  <reason value="1"/>
                  <role>2</role>
                  <detail>3</detail>
               </makefault>
               <send/>
            </else>
         </filter>
       </outSequence>
   </target>
   <description></description>
</proxy>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top