Web Services SOAP

In Java 6 è disponibile la libreria JAX-WS che supporta la scrittura di Web Services sia REST che SOAP. Un Web Service SOAP può essere una singola classe Java (come nel caso dell'esempio che segue) oppure un'interfaccia con le operazioni (detta SEI: service endpoint interface) e una sua implementazione (SIB: service implementation bean). Il codice seguente definisce un semplice Web Service con due metodi (annotati con @WebMethod), di cui uno prende un parametro come input. L'annotazione @WebService segnala che questa classe è un web Service: in genere si annota così l'interface SEI, mentre la classe SIB sarà annotata con @WebService(endpointInterface = "org.altervista.fabriziocelli.TestWS"). Nel caso di SEI e SIB, le annotazioni @WebMethod andranno solo nell'interfaccia.

@WebService
@SOAPBinding(style=Style.RPC)
public class TestWS {
	
	@WebMethod
	public String getLanguages (){
		return "{en, fr, it}";
	}

	@WebMethod
	public String getTermcodeByTerm(String searchTerm) {
		return searchTerm;
	}
}
			

I due pezzi di codice seguente mostrano come pubblicare in Web service in modo normale oppure con un endpoint multi-thread. La URL http://localhost:8888/testws indica l'indirizzo al quale in servizio sarà disponibile, mentre il WSDL sarà generato all'indirizzo http://localhost:8888/testws?wsdl :

public class PublishWS {
    public static void main(String[] args) {
	 Endpoint.publish("http://localhost:8888/testws", new TestWS());
	 System.out.println("Service is published!");
    }
}			
			

public class PublishTestWSMT {
	
	public static void main(String[] args) {
	    //WS url
	    String url = "http://localhost:8888/testws";
	    //the service
	    Endpoint endpoint = Endpoint.create(new TestWS());
		
	    //threads pool and execution
	    ExecutorService executor = Executors.newFixedThreadPool(10);
	    endpoint.setExecutor(executor);
		
	    //publish WS
	    endpoint.publish(url);
	    System.out.println("Service is published!");
	}

}
			

La scrittura di un client può essere semplificata da alcune utilità presenti nella distribuzione JDK che consentono di generare il WSDL e le classi per scrivere il client. La procedura per la pubblicazione del WS è quindi:

  1. Compilare il WS (e, nel caso di altro oggetti di supporto, compilare il tutto):
    javac org/altervista/fabriziocelli/*.java
  2. Generare gli artefatti e il WSDL:
    wsgen -keep -verbose -cp. org.altervista.fabriziocelli.TestWS -wsdl
  3. Eseguire una delle due classi per pubblicare il servizio Invocare la utility per creare le classi per scriver il client, indicando il nome del package in cui le classi di supporto andranno a finire (se non esiste, il percorso verrà creato):
    wsimport -p org.altervista.fabriziocelli.wsClient -keep http://localhost:8888/testws?wsdl

A questo punto è possibile scrivere il client, usando la classe generata che termina per Service e creando l'oggetto Port che incapsula le operazioni del Web service:

public class TestClient {
	public static void main(String[] args){
		//instantiate the service
		TestWSService service = new TestWSService();
		//open the port
		TestWS port = service.getTestWSPort();
		
		//call the methods
		System.out.println(port.getLanguages());
		System.out.println(port.getTermcodeByTerm("prova"));
	}
}
			

Qui è possibile scaricare il progetto Eclipse con l'esempio usato: scarica