330 likes | 405 Views
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
E N D
Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação
WSDL (Web Services Definition Language)
Definição • Proporciona modelo e formato XML para descrever Web Services • O seu principal objetivo é descrever as interfacesapresentadas 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.
Elementos da WSDL WSDL document Types (type information for the document, e.g., XML Schema) Message 1 Message 2 Message 3 Message 4 Message 5 Message 6 Abstract description of the service Operation 1 Operation 2 Operation 3 Interface (abstract service) binding 1 binding 2 binding 3 binding 4 endpoint 1 endpoint 2 endpoint 3 endpoint 4 Concrete description of the service Service (the interface in all its available implementations)
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'> <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