Come consumare un servizio SOAP con Pentaho DI
Quando abbiamo a che fare con aziende che usano, o intendono farlo, soluzioni software costruite sui principi SOA (Service-Oriented Architecture) e/o che espongono Servizi Web per l’accesso alle loro strutture dati, diventa indispensabile dotarsi di strumenti di ETL (Extract, Transform, Load) in grado di operare come client SOAP/REST.
In questo articolo vedremo come sia possibile utilizzare lo step HTTP di Pentaho Data Integration per consumare un servizio SOAP.
Il progetto PentahoDiLabs sviluppato, che utilizza un web service di “Controllo delle Partite Iva comunitario” messo a disposizione dalla Commissione Europea, è stato pubblicato su GitHub e sviluppato/testato su un laptop con i seguenti software:
- Pentaho Data Integration 6.0.0 - http://www.pentaho.com/product/data-integration
- Soap UI 5.2.1 - http://www.soapui.org/
- Java 1.7.0 - http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
Il Web Service
Il documento WSDL del servizio l’ho trovato sul sito dell’Agenzia delle Entrate a questo indirizzo dove fondamentalmente viene spiegato cosa fa.
In estrema sintesi utilizzando tale servizio possiamo verificare se il numero identificativo IVA inserito è formalmente corretto e corrisponde ad un operatore abilitato ai fini intracomunitari ed anche ottenerne la denominazione;
Test del service con SOAP UI
Uno dei più popolari tool per testare Web Service è SOAP UI. Questo software può essere utilizzato anche per copiare la busta SOAP da inoltrare al servizio.
Lanciamo Soap UI e selezioniamo File > New SOAP Project (così come mostrato in Figura 1).
Forniamo un nome per il progetto, la URI (Uniform Resource Identifier) del WSDL e poi clicchiamo su OK (così come indicato nella Figura 2 d'esempio).
Figura 2 - Impostazione del nome progetto e URI del documento WSDLIl tool costruirà, parsando la descrizione WSDL, una richiesta di esempio che potremmo andare a modificare per testare il servizio e visualizzare la risposta.
Nel caso specifico il tool proporrà:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types"> <soapenv:Header/> <soapenv:Body> <urn:checkVat> <urn:countryCode>?</urn:countryCode> <urn:vatNumber>?</urn:vatNumber> </urn:checkVat> </soapenv:Body> </soapenv:Envelope>
Noi andremo a sostituire:
countryCode = IT
vatNumber = partita iva da verificare
Successivamente avvieremo la richiesta di esecuzione (tasto play) per ottenere la risposta visibile in Figura 3.
Figura 3 - Esecuzione della richiesta di verifica VAT via Web ServicesLa trasformazione Pentaho DI
Nella trasformazione consumeSoapWebService_v1 utilizziamo in sequenza i seguenti step:
Step | Scopo |
DataGrid | Popola input richiesta |
Modified Javascript Value | Crea requestXML |
HTTP Post | Lancia Web Service |
Write to log | Scrive nel log la risposta |
Il primo Step ha il solo scopo di popolare l’input della richiesta. Volendo replicare la richiesta svolta con SOAP UI lo configureremo come nella figura seguente.
Figura 4 - Configurazione parametri d'input per lo step "Parametri WS"Il secondo step ha invece il compito di creare la requestXML che possiamo anch’essa copiare ed incollare dal tool di test, facendo attenzione a sostituire i valori con le variabili provenienti dal flusso (nel nostro caso countryCode e vatNumber).
Figura 5 - Configurazione dello step "Generate SOAP Request"var request = new XML() // Request XML generated by SOAP UI // // Change the request to match your needs. // Inject arguments in the place of the question marks like this: // // var eMail = "someone@example.com"; // request=... // <ws:email>{eMail}</ws:email> ...; // // where eMail is the name of a scoped JS variable. That includes input fields. // // See also: https://developer.mozilla.org/En/E4X // // request = <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types"> <soapenv:Header/> <soapenv:Body> <urn:checkVat> <urn:countryCode>{countryCode}</urn:countryCode> <urn:vatNumber>{vatNumber}</urn:vatNumber> </urn:checkVat> </soapenv:Body> </soapenv:Envelope>; var requestXml=request.toXMLString();
Il terzo step consuma il web service inoltrando via post all’end point del servizio la request XML
Figura 6 - Configurazione dello step "HTTP Post" per la chiamata al Web ServiceIl quarto step mette in evidenza nel log la risposta
Figura 7 - Configurazione dello step "Write to log" Figura 8 - Esecuzione della trasformazione appena creataSuggerimenti per consumare la risposta
Nell’esempio precedente manca il passaggio fondamentale per considerare questa trasformazione un client SOAP ovvero il parsing della risposta.
Quando si utilizzano strumenti che mirano ad ingegnerizzare le attività di sviluppo software, l’imperativo deve essere scrivere meno codice possibile. Per questo motivo piuttosto che utilizzare la soluzione (“istintiva” per uno sviluppatore) di consumare la risposta del servizio utilizzando un altro step Modified Javascript Value (soluzione possibile) nel quale andare a parsare la response XML, preferisco operare un workaround per evitare la scrittura di codice, che consiste nel:
- salvare la risposta XML in un file di testo
- utilizzare lo step Get Data From XML per parsare la risposta con tutte le facility che lo strumento fornisce
Definito il risultato che vogliamo ottenere, possiamo attaccare lo step nella nostra trasformazione e modificare l’input dello step da “file” a “campo” (responseXML).
Figura 13 - Aggiunta dello step "Get data from XML" alla trasformazioneModifichiamo anche lo step log per evidenziare il risultato che si ottiene
Figura 14 - Modifica configurazione dello step "Write to log" Figura 15 - Esecuzione della trasformazione con evidenza in console delle informazioni ricevute dal Web ServiceA questo punto utilizzare i valori di risposta del service in un job chiamante sarà facile come bere un bicchier d’acqua.
Conclusioni
Ovviamente esistono numerosi modi di consumare servizi SOAP in modo più o meno veloce, ma l’utilizzo congiunto di SOAP UI e Pentaho DI rende l’operazione davvero semplice. Se non siete ancora stanchi di leggere, sul mio blog ho pubblicato nel corso del tempo articoli che trattano Pentaho DI.