Web Services SOAP in Java

I Web Service (in italiano Servizi Web) hanno un ruolo importante nell’architettura dei software moderni del web.  La diffusione esplosiva del web ha portato alla creazione di una grande quantità di infrastrutture di rete e server, e un Web Services sono software sviluppati appunto per facilitare l’interazione tra macchine tramite la rete, quindi tra macchine non tra umani.

Un client (desktop, web, mobili o embedded)  invia la richiesta su Internet e un server riceve la richiesta, la elabora e restituisce una risposta.  

Una caratteristica molto importante è che il client può essere scritto in qualsiasi linguaggio di programmazione (java, ASP, etc). Stessa cosa vale per il web service.

Questo perché i dati vengono scambiati in un formato comune a tutte le tecnologie: il client non sa come funziona il server e viceversa, ma entrambi lavorano insieme attraverso un vocabolario comune.

Per essere richiamabile da remoto vuol dire che il ws è in ascolto su un url specifico. L’indirizzo generalmente è cosi composto:

  • localhost:8080/<nome applicazione>/<nome ws>

 Alcuni servizi web utilizzano il formato dei messaggi SOAP, un particolare formato XML, altri usano il markup XML generico e altri ancora utilizzano JSON.

Web Service SOAP

 Un protocollo definisce un insieme di regole che il client deve rispettare per ottenere una risposta dal server che ospita ed espone il web service.

Il protocollo SOAP (Simple Object Access Protocol) definisce un protocollo per lo scambio di messaggi tra applicazioni.  SOAP utilizza HTTP come protocollo di trasporto, ma non è limitato nè vincolato ad esso, dal momento che può benissimo usare altri protocolli di trasporto, anche se la maggior parte dei web services usano  HTTP.

 Un messaggio SOAP (che è basato sul formato xml) è strutturato da un header ed un body.

Il segmento header è facoltativo e contiene meta-informazioni quali ad esempio la sicurezza, etc.

Il segmento body, invece, è obbligatorio e trasporta i dati richiesti (payload). Questo deve seguire uno schema definito dall’XML Schema.

La principale controindicazione nell’utilizzo di SOAP riguarda la sua eccessiva verbosità. I messaggi delle request e delle response sono codificati in un file XML che ha tag lunghi, ciascuno con diversi attributi e, di conseguenza, i messaggi occupano più spazio (e quindi più banda) rispetto ai formati più snelli, come ad esempio JSON.

WSDL

Il Web Service Definition Language (WSDL) è un linguaggio basato su XML che descrive un WS, come ad esempio gli aspetti quali l’indirizzo fisico del servizio, le operazioni supportate, tipologia dei messaggi per ogni operazione

E’ una specie di carta d‘identita del WS, che ci mostra, tra le altre cose, cosa fa e cosa vuole in input/output.

Più nel dettaglio mostra:

  • quali “operazioni” fornisce il servizio web, cioè cosa fa;
  • come utilizzarlo (il protocollo di comunicazione da utilizzare per accedere al servizio, il formato dei messaggi accettati in input e restituiti in output dal servizio
  • l’indirizzo dove il servizio è esposto

Gli elementi principali del WSDL sono:

  • <types>, i tipi di dati trasmessi
  • <message>, come sono composti i messaggi trasmessi
  • <portType>, elenca le operazioni del WS e quali messaggi ha in input e output.
  • <binding>, esprime come i messaggi SOAP vengano mappati sul protocollo di trasporto sottostante (http, smtp, etc)  e la codifica.
  • <service>, mostra l’url, endpoint, dov’è il servizio è esposto.

Questi elementi sono tag XML quindi un file wsdl avrà una forma del genere:

<wsdl:definitions
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">    
    <!-- abstract definitions -->                
    <wsdl:types>
        ....
    </wsdl:types>
    
    <wsdl:message>
        ....
    </wsdl:message>
    
    <wsdl:portType>
        ....
    </wsdl:portType>
    
    <!-- concrete definitions -->            
    <wsdl:binding>
        ....
    </wsdl:binding>
    
    <wsdl:service>
        ....
    </wsdl:service>
</wsdl:definitions>

Messaggio SOAP

Un messaggio SOAP è racchiuso nel tag soap:Envelope:

<?xml version=”1.0″?>

<soap:Envelope xmlns:soap=”http://www.w3.org/2001/12/soap-envelope”>

        …

</soap:Envelope>

L’Envelope ha due figli: l’Header, opzionale, e il Body, obbligatorio.

SOAP Header contiene metadati, informazioni utili al processamento del messaggio, come ad esempio l’identità dell’utente, informazioni riguardo la cifratura del documento, etc.

<?xml version="1.0"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope">

    <soap:Header>
        <myHeader soap:actor="..." soap:mustUnderstand="...">
            ...
        </myHeader>
    </soap:Header>
    
    <soap:Body ...>
        ...
    </soap:Body>
</soap:Envelope>

Il SOAP Body, obbligatorio, contiene i dati veri e propri del messaggio, anche chiamato Payload.

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
    <soap:Body xmlns="http://www.bank.org/ns">
        <pagamento>
            <da>cliente</da>
            <a>shop</a>
            <importo>100</importo>
        </pagamento>
    </soap:Body>
</soap:Envelope>

Esempio di scambi di messaggi SOAP

Un client invoca un WS inviandogli un messaggio soap di richiesta.

SOAP Request che da in input una stringa (“Prova”) e un intero (3)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://com/">
   <soapenv:Header/>
   <soapenv:Body>
      <com:pippo>
         <!--Optional:-->
         <arg0>Prova</arg0>
         <arg1>3</arg1>
      </com:pippo>
   </soapenv:Body>
</soapenv:Envelope>

SOAP Response, ritorna un solo elemento numerico (1)

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:pippoResponse xmlns:ns2="http://com/">
         <return>1</return>
      </ns2:pippoResponse>
   </soap:Body>
</soap:Envelope>

Implementazione

Per poter implementare un web service java offre vari modi. Il più semplice è tramite JAX-WS. Ossia è sufficiente mettere l’annotation @webservice su una classe i cui metodi vogliamo che siano esposti come servizi

Esempio

import javax.jws.WebService;

@WebService
public class Prova {

	public String helloWorld(String nome) {
		
		return "Benvenuto " + nome;
	}
}

Per invocare il w sabbiamo bisogno della sua carta d’identità, ossia il suo wsdl.

Per ottenerlo è sufficiente invocare, tramite browser, l’url su cui è esposto il ws, aggiungento “?wsdl”

Utilizziamo il tool gratuito SoapUI, scaricabile qua, per poter invocare il ws.

Avviamolo e digitiamo il tasto  SOAP

Si aprirà una finestra  per la creazione di uno nuovo progetto SOAP. Inserire il nome scelto del progetto e il wsdl del nostro WS, come mostrato in figura:

Verrà creato il client del nostro progetto:

Cliccando su request1 si apre la nostra soapRequest del metodo helloworld

Scrivere in arg0 il testo “Giuseppe” e prima il tasto identificato con il triangolo verde per inviare la request. Sulla destra verrà mostrata il soap message di risposta

Clicca sull’immagine, se vuoi scaricare il sorgente del progetto

Video Lezione sui Web Services Java

https://www.youtube.com/watch?v=zNCXksXTly4&t=18s

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *