sábado, 2 de junho de 2012

Descrevendo um Web Service - WSDL


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