Descrevendo um Web Service - WSDL
Depois de estudarmos o protocolo de transporte SOAP, aprenda agora como descrever um Web Services.
WSDL
Service Web Definition Language define um sistema para a descrição de serviços. Através dela, descrevemos os serviços externos, ou interfaces que são oferecidos por uma determinada aplicação, independente de sua plataforma ou linguagem de programação.
A especificação da linguagem, em XML, descreve a estrutura da XML que cada documento WSDL deve obedecer (http://www.w3.org/XML/Schema/). A WSDL se encontra atualmente na versão 2.0, disponibilizada no web site http://www.w3.org/TR/wsdl20/. Submetida a W3C, foi definida em esforço conjunto entre Microsoft, IBM e Ariba.
O seu principal objetivo é descrever as interfaces apresentadas e apontar a localização dos seus serviços, disponíveis em um local previsível e bem conhecido, na rede, o qual permite que o cliente acesse de maneira confiável. Por ser um documento XML, sua leitura se torna fácil e acessível.
Componentes
Através dos componentes, é possível uma maior flexibilidade dos WSDL, estes podem ser reutilizados para definir diferentes serviços. Os componentes são:
. Tipos de dados: Denominados de tipos <types>.
. Parâmetros de entrada e saída de um serviço: Denominados de mensagem <message>.
. O relacionamento entre parâmetros de entrada e saída: Assinatura do método, denominada de operações <operation>.
. Agrupamento lógico de operações: Denominado de tipo de porta <portType>.
. O protocolo a ser usado para acessar os métodos de um objeto: Denominado de vínculo, define o protocolo a ser usado para acessar os métodos de um objeto (SOAP, HTTP ou MIME).
. Endereço do serviço. Além dos componentes acima, define um serviço.
O diagrama a seguir mostra os principais elementos da WDSL que podem ocorrer e um documento.

Figura 1. Principais elementos de um WSDL.
Namespaces
Os namespaces são espaços para nomes, definidos no interior dos documentos XML. Um documento WSDL é um XML, que utiliza os namespaces para maximizar a taxa de reutilização dos componentes de um documento WSDL, utilizando-se de atributos para fazer referência a outros elementos, seja dentro ou fora do documento.
Abaixo uma tabela com os principais namespaces de um documento WSDL:
Prefixo
|
URI do namespace
|
Descrição
| |
WSDL
|
http://schemas.xmlsoap.org/wsdl
|
Namespace de WSDL para framework WSDL
| |
SOAP
|
http://schemas.xmlsoap.org/wsdl/soap
|
Namespace de WSDL para vinculo de SOAP e WSDl
| |
HTTP
|
http://schemas.xmlsoap.org/wsdl/http
|
Namespace de WSDL para WSDL http GET & vinculo POST
| |
Mime
|
http://schemas.xmlsoap.org/wsdl/mime
|
Namespace de WSDL para vinculo MIME de WSDL
| |
Soapenc
|
http://schemas.xmlsoap.org/soap/encoding
|
Namespace de codificação conforme definido pelo SOAP 1.1
| |
Soapenv
|
http://schemas.xmlsoap.org/soap/envelope
|
Namespace de codificação conforme definido pelo SOAP 1.1
| |
Xsi
|
http://www.w3.org/2001/XMLSchema-instance
|
Namespace da instância conforme definido pelo esquema de XML
| |
xsd
|
http://www.w3.org/2001/XMLShema
|
Namespace do esquema conforme definido pelo esquema de XML
|
Elemento <definitions>
É o elemento raiz de qualquer documento WSDL. Ele contém atributos que servem para definir os namespaces utilizados no documento WSDL.
Elemento <types>
O elemento types contém os tipos de dados que estão presentes na mensagem. Exemplo:
<wsdl:part name=”endereco” type=”xsd:string” /> <wsdl:part name=”numero” type=”xsd:int” /> |
Elemento <message>
O elemento message define os dados a serem transmitidos. Cada elemento messagerecebe um ou mais elementos <part>, que formam as partes reais da mensagem. O elemento <part> define o conteúdo da mensagem representando os parâmetros que são passados e a resposta que o serviço retorna.
<wsdl:message name=”getCidade”>
<wsdl:part name=”cidade” type=”xsd:string” /> </wsdl:message> <wsdl:message name=”getCidadeResponse”> <wsdl:part name=”getCidadeReturn” type=”xsd:string” /> </wsdl:message> |
Elemento <import>
O elemento import funciona como separação entre as várias partes de uma definição WSDL. Ele possui dois atributos, os quais definem a localização do documento importado e o seu namespace.
<import namespasce=”http://www.cidade.com/definitions/CidadeRemoteInterface”
location=”http://localhost/esdl/Cidade-interface.wsdl/” /> |
Certifique-se sempre que o atributo location aponte para o arquivo correto.
Elementos <operation> e <portType>
Os elementos portType possuem um conjunto de operações (<operation>), as quais possuem um atributo name e um atributo opcional para especificar a ordem dos parâmetros usados nas operações.
Existem quatro diferentes tipos de mensagens de operações, segundo:
. Operação unidirecional: Define uma mensagem enviada de um cliente para um serviço, sem resposta.
. Solicitação-Resposta: O mais utilizado. O cliente envia uma solicitação a um serviço, e recebe como resultado uma mensagem de resposta com o resultado dessa solicitação. Pode ser vista como um RPC (remote procedure call).
. Pedido-Resposta: Não utilizada freqüentemente. Define uma mensagem enviada do serviço para o cliente, resultando em uma mensagem enviada do cliente de volta para o serviço.
. Notificação: É quando o serviço envia uma mensagem para o cliente.
Como você pode ver, o portType corresponde apenas a um agrupamento de operações, onde você pode agrupá-las em um ou vários elementos <portType>. Caso você utilize uma ferramenta para se criar a WSDL, como por exemplo o Axis em Java ou o nuSOAP no PHP, estas ferramentas poderão tomar esta decisão.
Elemento <binding>
O elemento binding mapeia os elementos operation em um elemento portType, para um protocolo especifico. Ele associa o elemento portType ao protocolo SOAP, utilizando-se de um elemento de extensão SOAP chamado <wsdlsoap:binding>, através de dois parâmentos: protocolo de transporte e o estilo da requisição (rpc ou document).
<wsdl:binding name=”CidadeSoapBinding” type=”impl:Cidade”>
<wsdlsoap:binding style=”rpc” transport=http://schemas.xmlsoap.org/soap/http /> |
Elementos <service> e <port>
Os elementos service e port definem a localização real do serviço, tendo em vista que o mesmo pode conter varias portas e cada uma delas é especifica para um tipo de ligação, descrita no elemento binding.
<wsdl:service name=”ConsultaCidadeService”>
<wsdl:port binding=”impl:ConsultaCidadeSoapBinding” name=”ConsultaCidade”> <wsdlsoap:address location=http://localhost/wsdl/ConsultaCidadeServer.php/> </wsdl:port> </wsdl:service> |
Exemplo de WSDL
<?xml version="1.0" encoding="ISO-8859-1" ?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:server.hello" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:server.hello"> <types> <xsd:schema targetNamespace="urn:server.hello"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> </xsd:schema> </types> <message name="helloRequest"> <part name="name" type="xsd:string" /> </message> <message name="helloResponse"> <part name="return" type="xsd:string" /> </message> <portType name="server.helloPortType"> <operation name="hello"> <documentation>Retorna o nome</documentation> <input message="tns:helloRequest" /> <output message="tns:helloResponse" /> </operation> </portType> <binding name="server.helloBinding" type="tns:server.helloPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="hello"> <soap:operation soapAction="urn:server.hello#hello" style="rpc" /> <input> <soap:body use="encoded" namespace="urn:server.hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:server.hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> <service name="server.hello"> <port name="server.helloPort" binding="tns:server.helloBinding"> <soap:address location="http://localhost/imasters2/nuSOAP/server2.php" /> </port> </service> </definitions> |
Bibliografia
HENDRICKS, M.; GALBRAITH, B., et al., Profissional Java Web Services. Rio de Janeiro: Alta Books, 2002.
W3C, World Wide Web Consortium. Web Services Architecture. http://www.w3.org/TR/ws-arch/
Nenhum comentário:
Postar um comentário