Web Service é uma abordagem moderna e leve para o desenvolvimento de sistemas de software distribuídos (sistemas que necessitam de diferentes componentes para executar em dispositivos fisicamente distintos). Os Web Services são baseados em XML, possuem baixo acoplamento, e são síncronos ou assíncronos.

As principais tecnologias dos Web Services são: SOAP, WSDL e UDDI. SOAP é a estrutura de empacotamento padrão para transportar documentos XML através de protocolos da Internet (HTTP, SMTP, FTP). WSDL é a tecnologia que padroniza a descrição da interface de um Web Service e será visto mais profundamente no restante do artigo. Por fim, UDDI é o repositório mundial de Web Services utilizado para publicar e/ou descobrir serviços que já foram criados e utilizar os já existentes.

Segue abaixo uma imagem mostrando o funcionamento básico de um Web Service:

Funcionamento básico de um Web Service.
Figura 1. Funcionamento básico de um Web Service

Basicamente a figura abaixo mostra um repositório UDDI com diversos arquivos de descrição de Web Services que são os WSDL. Um Serviço Consumidor contata um UDDI procurando por um determinado Web Service que retorna um WSDL para que ele possa se comunicar com um Web Service. Quando o Serviço Consumidor se comunica com um Web Service ele faz isso através do protocolo SOAP. No restante do artigo estudaremos mais o que é e que está por trás do WSDL.

Linguagem XML

Para entendermos como funcionam os Web Services primeiramente devemos entender o que é e como funciona o XML, pois ela é utilizada como base tanto para a descrição dos serviços Web quanto para a troca de dados entre eles.

O Xml permite que os usuários ou programadores definam as marcas (etiquetas) que serão utilizadas para descrever os documentos, agregando semântica e estrutura ao seu conteúdo. Os documentos podem então ser utilizados para descrever (estruturas de) dados e informações de maneira simples. Por exemplo, abaixo vamos representar os dados de uma pessoa em XML:


<Pessoa>
	<Nome>João Ferreira</Nome>
	<Endereço>
		<Logradouro>Rua Ana Maria</Logradouro>
		<Número>780</Número>
		<Complemento>Apto. 11</Complemento>
	</Endereço>
	<DataNascimento>05/08/1983</DataNascimento>
</Pessoa>
Listagem 1. Representação de dados de uma pessoa em XML

Podemos notar que há marcas de inicio e de fim, isso indica onde inicia e onde termina cada um dos elementos. Assim, há uma distinção entre as marcas e o conteúdo. Também há uma estrutura e até mesmo uma hierarquia entre as marcas.

XML descreve, por tanto, a estrutura de um documento (ou estrutura de dados) e seus atributos, utilizando uma abordagem independente de plataforma, compreensível tanto pelo homem quanto pelo computador. Por ser independente de plataforma ele é adotado na web e, portanto, por Web Services para troca de dados. Para manter essa independência e para que os programas não carreguem consigo de maneira estática informações sobre os tipos de dados de um documento criou-se um mecanismo para que essas informações fossem especificadas. Para isso temos um DTD (Document Type Definition) que nos permite definir as marcas que são utilizadas por um documento e quais são os seus tipos e restrições, seguindo, também, uma linguagem independente de plataforma.

Portanto, com um DTD um programa pode ler e interpretar corretamente um documento descrito em XML, além de saber se ele está corretamente especificado.

WSDL (Web Services Description Language)

WSDL (em português significa Linguagem de Descrição de Serviços Web) é uma linguagem de descrição de serviços Web. A descrição envolve informações críticas como:

  • O endpoint do serviço
  • Operações
  • Tipos de dados necessários a tais operações.

Essa descrição é feita em uma linguagem específica que é chamada de WSDL. WSDL é como se fosse um contrato entre o serviço (Web Services) e o seus consumidores. Ele é completamente baseado em XML, sendo assim legível e textual. As etiquetas (ou tags) do WSDL são utilizadas para descrever um serviço. Assim, todo cliente que acessa o WSDL de um Web Service pode conhecer onde ele está localizado e quais são as operações que ele oferece. Portanto, sabemos o que um serviço web precisa receber para funcionar e o que ele devolver após a execução.

Segue abaixo o exemplo de um WSDL de um serviço que efetua operações de uma calculadora:


<definitions targetNamespace=<http://calc/> 
name="CalculadoraServerImplService">
<types/>
<message name="soma">
		<part name="arg0" type="xsd:float"/>
		<part name="arg1" type="xsd:float"/>
</message>
<message name="somaResponse">
		<part name="return" type="xsd:float"/>
</message>
<message name="multiplicacao">
		<part name="arg0" type="xsd:float"/>
		<part name="arg1" type="xsd:float"/>
</message>
<message name="multiplicacaoResponse">
		<part name="return" type="xsd:float"/>
</message>
<message name="subtracao">
		<part name="arg0" type="xsd:float"/>
		<part name="arg1" type="xsd:float"/>
</message>
<message name="subtracaoResponse">
		<part name="return" type="xsd:float"/>
</message>
<message name="divisao">
		<part name="arg0" type="xsd:float"/>
		<part name="arg1" type="xsd:float"/>
</message>
<message name="divisaoResponse">
		<part name="return" type="xsd:float"/>
</message>
<portType name="CalculadoraServer">
		<operation name="soma" parameterOrder="arg0 arg1">
			<input wsam:Action = "http://calc/CalculadoraServer/somaRequest" 
			message="tns:soma"/>
			<output wsam:Action	=	
			"http://calc/CalculadoraServer/somaResponse" message="tns:somaResponse"/>
		</operation>
		<operation name="multiplicacao" parameterOrder="arg0 arg1">
			<input wsam:Action = "http://calc/CalculadoraServer/multiplicacaoRequest" 
			message="tns:multiplicacao"/>
			<output wsam:Action = "http://calc/CalculadoraServer/multiplicacaoResponse" 
			message="tns:multiplicacaoResponse"/>
		</operation>
		<operation name="subtracao" parameterOrder="arg0 arg1">
			<input wsam:Action = "http://calc/CalculadoraServer/subtracaoRequest" 
			message="tns:subtracao"/>
			<output wsam:Action = "http://calc/CalculadoraServer/subtracaoResponse" 
			message="tns:subtracaoResponse"/>
		</operation>
		<operation name="divisao" parameterOrder="arg0 arg1">
			<input wsam:Action = "http://calc/CalculadoraServer/divisaoRequest" 
			message="tns:divisao"/>
			<output wsam:Action = "http://calc/CalculadoraServer/divisaoResponse" 
			message="tns:divisaoResponse"/>
		</operation>
</portType>
<binding name="CalculadoraServerImplPortBinding" type="tns:CalculadoraServer">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
		<operation name="soma">
<soap:operation soapAction=""/>
			<input>
				<soap:body use="literal" namespace="http://calc/"/>
			</input>
			<output>
				<soap:body use="literal" namespace="http://calc/"/>
			</output>
		</operation>
		<operation name="multiplicacao">
			<soap:operation soapAction=""/>
			<input>
				<soap:body use="literal" namespace="http://calc/"/>
			</input>
			<output>
				<soap:body use="literal" namespace="http://calc/"/>
			</output>
		</operation>
		<operation name="subtracao">
			<soap:operation soapAction=""/>
			<input>
				<soap:body use="literal" namespace="http://calc/"/>
			</input>
			<output>
				<soap:body use="literal" namespace="http://calc/"/>
			</output>
		</operation>
		<operation name="divisao">
			<soap:operation soapAction=""/>
			<input>
				<soap:body use="literal" namespace="http://calc/"/>
			</input>
			<output>
				<soap:body use="literal" namespace="http://calc/"/>			

                             </output>
		</operation>
</binding>
<service name="CalculadoraServerImplService">
		<port name="CalculadoraServerImplPort" binding="tns:CalculadoraServerImplPortBinding">
			<soap:address location="http://127.0.0.1:9876/calc"/>
		</port>
</service>
</definitions>
Listagem 2. Exemplo de WSDL

Nesse arquivo WSDL verificamos que existem várias seções, vamos analisar apenas as mais importantes (que estão em negrito no exemplo), afinal não precisamos entender todo o arquivo WSDL, muitas partes do arquivo são ou gerados por uma ferramenta ou lida por outra ferramenta. A primeira sessão importante a ser analisada é a portType que grupa as operações que o serviço oferece. No exemplo podemos verificar que quatro operações são definidas: “soma, subtracao, multiplicacao, divisão”. Essa sessão é como uma interface Java, visto que as informações são apresentadas de maneira abstrata, sem quaisquer detalhes de implementação.

Cada operação do serviço tem uma mensagem de entrada e uma mensagem de saída, ou seja, o que o serviço precisa receber para funcionar e o que ele devolve após executar.

Outra sessão para analisarmos é a service. Essa sessão especifica qual a localização do serviço através do atributo location. No exemplo acima o serviço está localizado na URL http://127.0.0.1:9876/calc que é chamado como o endpoint (ponto) do serviço, ou seja, onde o serviço pode ser encontrado. Essa informação é importante para o cliente, pois é neste ponto que ele descobre em que servidor está o serviço.

Conclusão

Neste artigo estudamos o que é XML e porque essa linguagem é tão importante para entendermos Web Services e seu descritor. WSDL é uma linguagem que permite descrevermos um serviço.

Ambientes de programação possuem diversas ferramentas que automatizam a tarefa de geração dos arquivos WSDL e que também analisam um arquivo WSDL e automaticamente geram classes capazes de acessar um Web Service para nós, tornando muito mais simples a vida do programador. No entanto, ainda é extremamente importante que saibamos o que é o WSDL e quais as suas partes fundamentais.