Descrevendo um Web Service – WSDL

Depois de estudarmos o protocolo de transporte SOAP, aprenda agora como descrever um Web Services.

WSDL

Web Service 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 message recebe 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/&#8221;
xmlns:xsd=”http://www.w3.org/2001/XMLSchema&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
xmlns:SOAP-ENC=”http://schemas.xmlsoap.org/soap/encoding/&#8221;
xmlns:tns=”urn:server.hello” xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/&#8221;
xmlns:wsdl=”http://schemas.xmlsoap.org/wsdl/&#8221;
xmlns=”http://schemas.xmlsoap.org/wsdl/&#8221; targetNamespace=”urn:server.hello”>
<types>
<xsd:schema targetNamespace=”urn:server.hello”>
<xsd:import namespace=”http://schemas.xmlsoap.org/soap/encoding/&#8221; />
<xsd:import namespace=”http://schemas.xmlsoap.org/wsdl/&#8221; />
</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&#8221; />
<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/&#8221; />
</input>
<output>
<soap:body use=”encoded” namespace=”urn:server.hello”
encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/&#8221; />
</output>
</operation>
</binding>
<service name=”server.hello”>
<port name=”server.helloPort” binding=”tns:server.helloBinding”>
<soap:address location=”http://localhost/imasters2/nuSOAP/server2.php&#8221; /> </port>
</service>
</definitions>

_________________________________

Fonte: iMasters – Mauricio Reckziegel

Anúncios

About Gustavo Amaro

+ Formado em Tecnologia e Análise de Sistemas + MBA em Desenvolvimento de Aplicações JAVA – SOA

Posted on 1 de Outubro de 2012, in Integração, Web Service, WSDL and tagged , , , , , . Bookmark the permalink. Deixe um comentário.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: