Domanda

Voglio costruire un proxy che:
1. Chiamare Servizio che autorizzano e dare risultato OK o Fail (1a Service)
2. Se Risultato ‘OK’ quindi chiamare un servizio

Il problema è che, quando il primo servizio restituire il messaggio:

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

E io do “filtraggio” a Out Sequence. Ecco l'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>

Quando eseguo la mia applicazione, l'ESB danno sempre il messaggio:

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

Sembra che la condizione del filtraggio è sempre false.
Qual è l'affermazione corretta per la XPath nel filtro?

È stato utile?

Soluzione

Sembra che si può avere dato un espressione XPath sbagliata. Non si può dare un XPath ed un'espressione booleana sia per il valore XPath, vale a dire che non può essere "/ risultato / status = 'OK'", ma deve essere "/ risultato / stato". Poi, secondo la sequenza, sarebbe fuoco della sezione dopo allora, se questo elemento è presente. Dal momento che, è necessario valutare una condizione booleana nonché in base alla XPath, io presento un'alternativa basata sul mediatore interruttore (stesso può essere fatto per il filtro impostando una proprietà):

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

Altri suggerimenti

La configurazione di proxy dovrebbe essere sguardo come segue

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top