13 marzo 2008

Web Service in Java

Ultimamente mi sono dovuto occupare ripetutamente di Web Service.

Ho sviluppato client e server Web Service in .Net (C# e VB.NET), Java, ASP e Visual Basic 6.

Mi manca fare un client Web Service in Assembler 68000 e le ho veramente viste tutte!

Il lavoro più complesso ha riguardato la realizzazione di un Web Service in .Net che doveva essere consumato da SAP. "Il bello" di SAP è che decide lui come invocare il tuo web service. Tu puoi anche fare un WSDL, ma lui non se lo fila e ti passa un messaggio XML-SOAP costruito come vuole lui.

Alla fine è il server che deve adattarsi al client! Alla faccia degli standard.

Oggi ho completato un client Java che deve invocare un Web Service in .Net, e devo dire che superate le solite complicazioni di Java per compilare correttamente quello che serve, poi è veramente una passeggiata.

Ecco un brevissimo tutorial che ho preparato:

-------------------------------------------------------
Per invocare i metodi di un Web Service è necessario disporre del pacchetto Apache Axis (1.4).
Per un corretto funzionamento i jar che si trovano nella directory axis/lib devono essere inclusi nel classpath.

Una volta installato Axis, sarà necessario utilizzare la sua classe WSDL2Java per generare le classi Java che consentiranno ad un applicativo di invocare i metodi del web service come se si trattasse di una classe locale.

Al WSDL2Java deve essere passato l'indirizzo del wsdl del web service che si desidera utilizzare.

Es:
java org.apache.axis.wsdl.WSDL2Java http://127.0.0.1:8080/test/TestWs?wsdl

WSDL2Java genererà un apposito package che deve essere incluso nel progetto.
Il progetto deve far riferimento anche ai jar di Axis che si trovano nella cartelle axis/bin

Ad esempio io ho utilizzato il WSDL di un webservice denominato TestWS, il cui namespace è "http://dhanago.test.com/".

Il WSDL2Java mi ha creato un package com.test.dhanago che tramite Axis invocherà i metodi del web service in modo del tutto trasparente

Per stabilire la connessione bastano due semplici istruzioni:

com.test.dhanago.TestWsServiceLocator loc = new com.test.dhanago.TestWsServiceLocator();
com.test.dhanago.TestWs port = loc.getTestWsPort();

Una volta connesso, è possibile invocare singolarmente i diversi metodi che vengono esposti dall'oggetto port.

res = port.HelloWorld("Mario");