sexta-feira, julho 29, 2005

Mas que raio é WSDL ?

WSDL, é de acordo com o tutorial patente nos W3Schools, Web Services Description Language, e serve para descrever em detalhe e pormenor todas as características de um Web Services, o protocolo de suporte para transmissão da informação (HTTP,SMTP,etc), quais os parâmetros necessários para invocar o Web Service (WS), assim como os parâmetros de retorno esperados. Ao fim e ao cabo, o WS pode ser visto como se fosse uma função de Linguagem de Programação, sendo que nós (o cliente) temos que pedir com o nome do WS e os parâmetros necessários (ou sem eles, como acontece num caso concreto em que estou a trabalhar), sendo-nos facultada uma resposta pedida.
Por exemplo, podemos ter um WS que devolva a data actual, e vamos imaginar que o WS se chama GetDate. Como é natural, não são necessários quaisquer parâmetros neste caso, e o nosso programa-Cliente cria uma mensagem SOAP para ser enviada por HTTP para o Fornecedor do WS (que vou designar por WSP, do inglês Web Service Provider). Este último, deve então, enviar, também através de SOAP, a informação requerida. Ora, então, o WSDL é o ficheiro que descreve em XML tudo que acabei de descrever.
Aqui fica um WSDL simples para o exemplo que estive a referir, supondo que o URL do WSP é http://www.getdate.com/getDate/ (não usem este endereço porque ele não existe é claro!)

<?xml version="1.0" encoding="UTF-8"?>
<definitions
name="WebServCGA"
targetNamespace="http://www.getdate.com/getdate"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.getdate.com/getdate/getdate.wsdl"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<MESSAGE name = "getDateRequest">
</MESSAGE>
<MESSAGE name = "getDateResponse">
<PART name = "date" type = "xsd:dateTime" >
</MESSAGE>
< PORTTYPE name="getDatePortType" >
<OPERATION name="getDateOperation">
<INPUT message="getDateRequest" />
<OUTPUT message="getDateResponse" />
</OPERATION>
</PORTTYPE>

<binding name="getdateBinding" type="tns:getdatePortType">
<soap:binding style="document"

transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getDateOperation">
<soap:operation
soapAction="http://www.getdate.com/getdate/"/>
<input>
<soap:body parts="" use="literal"/>
</input>
<output>
<soap:body parts="" use="literal"/>
</output>
</operation>
</binding>

<service name="getdate">
<port binding="tns:getdateBinding" name="getdatePort">
<soap:address location="http://www.getdate.com/getdate"/>
</port>
</service>

</definitions>


De acordo com o que ficou antes expresso, podemos olha para os elementos MESSAGE
como especificando cada uma das "funções" de que o WS é composto, ou melhor: a função
de que podíamos pensar como analogia de acordo com o exemplo acima, é partida em
duas: uma para enviar (GetDateRequest) e outra para receber (GetDateResponse).

Estas duas partes são "incorporadas" numa OPERATION, que especifica qual a MESSAGE de INPUT e qual a de OUTPUT. O elemento PORTTYPE permite incorporar várias OPERATIONs (se houver mais do que uma). Os PORTTYPE caracterizam o WS em abstracto, coisa que o BINDING se encarrega de fazer em concreto, ao especificar através do protocolo SOAP o meio através do qual o WS é transmitido. Finalmente, o SERVICE permite especificar qual o URL através do qual o WSP pode ser acedido, isto partindo do princípio que estamos a transmitir SOAP sobre HTTP, que é, aliás, o mais frequente.