Tópicos de Sistemas
de Informação A
Carlos Oberdan Rolim
Ciência da Computação
WSDL
(Web Services Definition Language)
Motivação
Definição
Proporciona modelo e formato XML para descrever Web
Services
O seu principal objetivo é descrever as interfaces
apresentadas e apontar a localização dos seus serviços,
permitindo que o cliente os acesse de maneira confiável.
Por ser um documento XML, sua leitura se torna fácil e
acessível.
Versão 1.1 – Março 2001
Versão 1.2 – Working Draft - Julho 2002
Versão 2.0
Recomendação W3C em 26 de Junho de 2007
Esforço conjunto entre Microsoft, IBM e Ariba
Independência de plataforma
O cliente não precisa saber qual a linguagem do
programação ou plataforma de execução em que o provedor
de serviços está baseado.
A descrição do serviço em conjunto com a infra-estrutura
SOAP adjacente encapsula detalhes tanto no lado do cliente
quanto no lado do provedor.
O uso de WSDL na arquitetura de Web Services é em geral
dividido em duas partes:
Abstrata: interface do serviço
Abstrai a funcionalidade oferecida pelo serviço
Concreta: implementação do serviço.
Detalhes concretos do serviço de como e onde a funcionalidade é
oferecida
Cada parte pode ser definida de maneira independente e
conseqüentemente reutilizada por outras aplicações.
Types (type information for the document, e.g., XML Schema)
Message 1
Message 2
Operation 1
Message 3
Message 4
Message 5
Operation 2
Operation 3
Interface (abstract service)
binding 1
binding 2
binding 3
binding 4
endpoint 1
endpoint 2
endpoint 3
endpoint 4
Service (the interface in all
its available implementations)
Message 6
Concrete description
of the service
WSDL document
Abstract description of the service
Elementos da WSDL
Interface de serviço
Descrição abstrata
Descreve de forma abstrata o WS em termos de mensagens que
ele envia e recebe
O tipo de sistema usado pra descrever as mensagens (baseado em
XML Schema)
As mensagens usadas para invocar o serviço
Define como operação o agrupamento de uma ou mais mensagens
segundo um padrão de troca de mensagens
O padrão de troca de mensagens identifica a seqüência e a
cardinalidade das mensagens enviadas/recebidas bem como quem está
as enviando/recebendo
Uma interface que agrupa as operações que constituem um serviço
abstrato
Semelhante a IDL (CORBA).
Implementação do serviço
Descrição concreta
Define um serviço como um agrupamento de pontos de serviço
(endpoints) que implementam a interface
Define os pontos de serviço ou endereço de rede de onde ocorre a
associação
Associa a interface ao protocolo de transporte
A implementação de serviço é um documento WSDL que descreve
como uma interface particular é implementada por um determinado
provedor de serviços.
Componentes
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. define a localização fisica de um
serviço <service>.
Elementos da Interface de Serviço
Tipos (types)
Definem os tipos de dados que são utilizados para
descrever as mensagens.
Para melhor interoperabilidade e independência de
plataforma usa-se sintaxe de XSD (XML Schema
Documents)
Exemplo
<types>
<schema targetNamespace="http://example.com/stockquote.xsd“
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
...
</element>
</schema>
</types>
Elementos da Interface de Serviço
Mensagens (message)
Representam uma definição abstrata dos dados que serão usados
em uma operação.
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
Cada <part> pode ser comparada com os parametros de uma
chamada de função em uma linguagem de programação tradicional
Exemplo
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
Elementos da Interface de Serviço
Operações (operation)
Definição abstrata de uma ação que um serviço pode executar. Indica
a ordem dos parametros usados nas operações.
Existem quatro diferentes tipos de mensagens de operações:
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
Elementos da Interface de Serviço
Operação unidirecional
<portType name=“.....">
<operation name=“SetPrice">
<input message="tns:setPriceInput"/>
<documentation> text </documentation>
</operation>
</portType>
Elementos da Interface de Serviço
Solicitação-resposta
<portType name=“.....">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
<fault message="tns:FaultMessagePrice"/>
<documentation> text </documentation>
</operation>
</portType>
Elementos da Interface de Serviço
Pedido-resposta
<portType name=“.....">
<operation name="GetClientPrice">
<output message="tns:RequestPrice"/>
<input message="tns:GetPriceInput"/>
<fault message="tns:FaultMessagePrice"/>
<documentation> text </documentation>
</operation>
</portType>
Elementos da Interface de Serviço
Notificação
<portType name=“.....">
<operation name=“SendNotification">
<output message="tns:NotifyClient"/>
<documentation> text </documentation>
</operation>
</portType>
Elementos da Interface de Serviço
Tipos de portas (portType)
O elemento <portType> é o elementos mais importante de um WSDL
Descreve um web service, as operações que podem ser efetuadas e
as mensagens de entrada e saida que estão envolvidas
Agrupa um conjunto de operações
Pode ser comparado a um módulo ou classe em uma linguagem de
programação tradicional
Exemplo
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
<operation name=“SendNotification">
<output message="tns:NotifyClient"/>
</operation>
</portType>
Elementos da Interface de Serviço
Ligações (binding)
O elemento binding mapeia os elementos operation em um
elemento portType, para um protocolo especifico.
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).
Exemplo
<binding name='ExemploBinding' type='tns:ExemploPortType'>
<soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getNome'>
<soap:operation soapAction='exemplo#getNome'/>
<input>
<soap:body use='encoded' namespace='exemplo‘
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='exemplo‘
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
Implementação do Serviço
Porta (port)
Especifica um endereço para uma ligação, definindo então um
endpoint único.
Exemplo
<port name='ExemploPort' binding='ExemploBinding'>
<soap:address location='http://127.0.0.1/servidor.php'/>
</port>
Implementação do Serviço
Serviço (service)
Define um ws agregando um conjunto de portas relacionados entre si.
Exemplo
<service name='ExemploService'>
<documentation>My first service</documentation>
<port name='ExemploPort' binding='ExemploBinding'>
<soap:address location='http://127.0.0.1/servidor.php'/>
</port>
</service>
Resumo dos elementos
Types– define os tipos de dados usados nas trocas de
mensagens
Message– representa de forma abstrata os dados que estão
sendo transmitidos
Operation– descrição abstrata de uma ação suportada pelo
serviço
Port Type– um conjunto abstrato de operações suportadas
por um ou mais pontos de serviço
Binding– associa concretamente o elemento portType a um
protocolo (geralmente SOAP)
Port– um único ponto de servico (endpoint) definido como
uma combinação de pontos de ligação (binding) e endereços
de rede (network address).
Service– um conjunto de pontos de serviços (endpoints).
Exemplo prático
A seguir é apresentado um exemplo prático de um ws.
Primeiro é definido o arquivo wsdl
É apresentada a implementação do servidor
Por fim o código fonte do cliente usado para consumir o ws
<?xml version ='1.0' encoding ='ISO88591' ?>
<definitions name='Exemplo'
targetNamespace='http://example.org/Exemplo'
xmlns:tns='http://example.org/Exemplo'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<message name='getNomeRequest'>
<part name='codigo' type='xsd:string'/>
</message>
<message name='getNomeResponse'>
<part name='resultado' type='xsd:string[]'/>
</message>
<portType name='ExemploPortType'>
<operation name='getNome'>
<input message='tns:getNomeRequest'/>
<output message='tns:getNomeResponse'/>
</operation>
</portType>
Codigo fonte do arquivo exemplo.wsdl
<binding name='ExemploBinding' type='tns:ExemploPortType'>
<soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getNome'>
<soap:operation soapAction='exemplo#getNome'/>
<input>
<soap:body use='encoded' namespace='exemplo'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='exemplo'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='ExemploService'>
<port name='ExemploPort' binding='ExemploBinding'>
<soap:address location='http://127.0.0.1/servidor.php'/>
</port>
</service>
</definitions>
Continuação do codigo fonte do arquivo exemplo.wsdl
<?php
function getNome($codigo) {
if (!$codigo)
throw new SoapFault('Client','Parametro nao preenchido');
// conecta ao Banco de Dados
$id = @pg_connect("dbname=samples user=postgres");
if (!$id)
throw new SoapFault("Server", "Conexao nao estabelecida");
// realiza consulta ao Banco de Dados
$result = pg_query($id, "select * from clientes " .
"where codigo=$codigo");
$matriz = pg_fetch_all($result);
if ($matriz == null) throw new SoapFault("Server", "Cliente nao encontrado");
// retorna os dados.
return $matriz[0];
}
// instancia servidor SOAP
$server = new SoapServer("exemplo.wsdl", array('encoding'=>'ISO88591'));
$server>addFunction("getNome");
$server>handle();
?>
Codigo fonte do arquivo servidor.php
<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$client = new SoapClient("http://127.0.0.1/exemplo.wsdl",
array(
"trace"
=> 1,
"exceptions" => 1));
try {
print "<b>Funcoes do disponiveis<br></b><pre>";
print_r($client->__getFunctions());
print “</pre>
// realiza chamada remota de método
// $retorno = $client>getNome(3);
// echo 'Código' . $retorno['codigo'] . '<br/>';
// echo 'Nome’ . $retorno['nome'] . '<br/>';
} catch (SoapFault $exception) {
print "<pre>";
print_r($exception);
print "</pre>";
}
?>
Codigo fonte do arquivo cliente.php