20 giugno 2008

Webservice, Axis e altre complicazioni...

Come credo di aver giù detto in un precedente post ultimamente la mia vita professionale sta ruotando sempre più intorno ai Web Service.

Sono stato chiamato da un cliente per integrare Lotus Notes con SAP... indovinate come? Ma ovvio, tramite un Web Service!

Lotus Notes è in grado di utilizzare con facilità Java, quindi utilizzando il framework Axis2 sono riuscito a farlo parlare con un Web Service esposto da SAP abbastanza facilmente.

Per prima cosa va preso il WSDL relativo al Web Service che si vuole invocare, e lo si passa all'applicativo java "wsdl2java" che è incluso con Axis2.

Una cosa del tipo: >wsdl2java -uri webservice.wsdl.

Fato questo si ottengono due belle classi java da includere nel proprio progetto (utilizzo Eclipse) con tutti i metodi del web service pronti per essere invocati come se stessimo "parlando" con una normale classe in locale.

Nel mio caso il web service si chiama MT_Test_Sincrono, e prende in input una string di esempio e la rimanda indietro con un prefisso.

Ecco un pezzetto di codice di esempio:

import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.transport.http.*;

//Qui vanno messi anche gli import per le classi create dal wsdl2java

public class prova {

public static void main(String[] args) throws Exception{

System.out.println("Prima di invocare");

//Crea la richiesta (oggetto request)
MT_Test_Sincrono_req req = new MT_Test_Sincrono_req();

//Crea il parametro
DT_Test_Sincrono param = new DT_Test_Sincrono();
param.setInput("prova");

//Aggiunge il parametro alla richiesta
req.setMT_Test_Sincrono_req(param);

//Istanza il servizio
MI_Test_SincronoServiceStub servizio = new MI_Test_SincronoServiceStub();

//Ottiene l'oggetto option dal servizio
ServiceClient serviceclient = servizio._getServiceClient();
Options options = serviceclient.getOptions();

//Crea un oggetto authenticator nel quale mette username e password
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername("prova1");
auth.setPassword("prova2");

//Aggiunge alle opzioni la proprietà "authenticate"
//e l'oggetto auhtenticator appena creato
options.setProperty(HTTPConstants.AUTHENTICATE,auth);

//invoca il metodo del webservice
MT_Test_Sincrono_res res;
res = servizio.MI_Test_Sincrono(req);

DT_Test_Sincrono_res res2 = res.getMT_Test_Sincrono_res();

System.out.println(res2.getOutput());
}
}

Incredibilmente la cosa più complicata è stato capire come accedere al web service quando questo richiede una autenticazione con login e password.

In ambiente .net non avevo avuto alcun problema a fare la cosa analoga e una rapida ricerca su google mi aveva dato subito una marea di esempi.

In Java invece la cosa era apparentemente più complicata, in quanto non si trovava documentazione chiara in proposito. Per chi ne avesse bisogno questa è la procedura:

1. Ottenere un riferimento all'oggetto option del servizio
ServiceClient serviceclient = servizio._getServiceClient();
Options options = serviceclient.getOptions();

2. Creare un oggetto authenticator
HttpTransportProperties.Authenticator
auth = new HttpTransportProperties.Authenticator();

3. Inserire la login e password nelle apposite proprietà dell'authenticator
auth.setUsername("prova1");
auth.setPassword("prova2");

4. Aggiungiamo come property alle option, l'oggetto authenticator
options.setProperty(HTTPConstants.AUTHENTICATE,auth);

et voilà... il web service sarà autenticato!

Nessun commento: