sabato 19 gennaio 2013

Lettura di un WSDL

Gli elementi descrittivi di un wsdl sono contenuti all'interno del tag definitions.
Vediamoli applicati ad un semplice servizio Web che implementa un solo metodo , il classico hello world.
Di seguito l'estratto del codice Java di generazione del servizio:

@WebService(name="salutatore")
public class Ciao {
 @WebMethod(operationName="helloWorld")
 public String saluta(String nome){
 return "Ciao "+nome;
 }

}


Il WSDL generato è il seguente:

<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.7-b01  svn-revision#${svn.Last.Changed.Rev}. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.7-b01  svn-revision#${svn.Last.Changed.Rev}. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.it/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.it/" name="CiaoService">
<types>
<xsd:schema>
<xsd:import namespace="http://ws.it/" schemaLocation="http://localhost:8080/WsWebServiceTest/Ciao?xsd=1"/>
</xsd:schema>
</types>
<message name="helloWorld">
<part name="parameters" element="tns:helloWorld"/>
</message>
<message name="helloWorldResponse">
<part name="parameters" element="tns:helloWorldResponse"/>
</message>
<portType name="salutatore">
<operation name="helloWorld">
<input wsam:Action="http://ws.it/salutatore/helloWorldRequest" message="tns:helloWorld"/>
<output wsam:Action="http://ws.it/salutatore/helloWorldResponse" message="tns:helloWorldResponse"/>
</operation>
</portType>
<binding name="salutatorePortBinding" type="tns:salutatore">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="helloWorld">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="CiaoService">
<port name="salutatorePort" binding="tns:salutatorePortBinding">
<soap:address location="http://localhost:8080/WsWebServiceTest/Ciao"/>
</port>
</service>
</definitions>

Le sezioni di cui si compone sono le seguenti:

TYPES

Opzionale, definisce i tipi di dato utilizzati.
I dati possono essere tipi semplici (xsd:string etc.) oppure xsd .
La sezione types può contenere direttamente gli xsd oppure puntare ad xsd esterni.
In questo caso l'xsd è linkato:


<xsd:schema><xsd:import namespace="http://ws.it/" 
schemaLocation="http://localhost:8080/WsWebServiceTest/Ciao?xsd=1"/></xsd:schema>


Accedendo all'url si può vedere l'xsd del tipo dato utilizzato.

<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.7-b01  svn-revision#${svn.Last.Changed.Rev}. --><xs:schema xmlns:tns="http://ws.it/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://ws.it/">
<xs:element name="helloWorld" type="tns:helloWorld"/>
<xs:element name="helloWorldResponse" type="tns:helloWorldResponse"/>
<xs:complexType name="helloWorld">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="helloWorldResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>


MESSAGES

Sono associati ai tipi e rappresentano per così dire i parametri di ingresso e di uscita delle operazioni dei servizi web (che sono quindi 2, vedi xsd sopra definito).

<message name="helloWorld">
<part name="parameters" element="tns:helloWorld"/>
</message>
<message name="helloWorldResponse">
<part name="parameters" element="tns:helloWorldResponse"/>
</message>


PORTTYPE 

Il PortType rappresenta l'interfaccia del metodo richiamato, si noti come il nome del port type sia il name del servizio Web mentre nel nodo operation abbiamo il censimento dell'unica operazione ad esso associata, denominata helloworld.

BINDING

Questa sezione, sempre utilizzando una sintassi "javista" rappresenta l'implementazione del servizio o dei servizi definiti nella sezione PORTTYPE.
 In particolare fornisce informazioni su:
  • Il protocollo di trasporto utilizzato, che può essere di tipo HTTP o SMTP. Dall'attributo transport si evince in questo caso che il protocollo utilizzato è HTTP;
  • Lo style del servizio, che può essere di tipo RPC oppure DOCUMENT (document è il default);
  • Il formato dati utilizzato nel messaggio SOAP,  anche qui ci sono due possibilità, literal (come in questo caso, si tratta  puro e semplice xml) oppure encoded (messaggio xml conforme a regole esterne). Si noti che il  formato encoded non è WS-I compliant.
SERVICE

La sezione service direttamente l'endpoint dove è disponibile il servizio.
 

Nessun commento:

Posta un commento