UNIVERSIDADE Sistemas Distribuídos Ciência da Computação Prof. Jesus José de Oliveira Neto Web Services (continuação) WSDL - Web Service Definition Language ● ● WSDL permite descrever o serviço que será oferecido que mensagens devem ser enviadas e qual a sua estrutura como usar vários protocolos de transporte onde o serviço está localizado, mais precisamente para que rede a mensagem deve ser enviada WSDL serve para descrever em XML todos os fatos relacionados ao serviço que são relevantes aos clientes WSDL – Descrição de um serviço ● ● ● Uma descrição de serviço é composta por uma parte abstrata e uma parte concreta A parte abstrata é formada por: Definições Tipos de dados Mensagens Interfaces A parte concreta é formada por: Bindings (escolha de protocolos) Serviços (endereço do servidor) Principais elementos de WSDL ● ● Descreve: As operações que o serviço faz Onde está localizado Como invocá-lo Exemplos de protocolos de transporte: SOAP HTTP SMTP Componente Interface do WSDL ● Conjunto de operações de web service dentro de um elemento XML (conhecido também como portType) ● Parecido com uma interface IDL do CORBA Cada operação deve definir um padrão de troca de mensagens In-Out: cliente envia e servidor deve responder In-Only: cliente envia e não necessita de resposta Out-Only: servidor responde e não precisa de resposta Robust-In-Only e Robust-Out-Only: envio de mensagens com garantia de entrega Padrões de troca de mensagens do WSDL Componente Interface do WSDL <portType name=”InterfaceOperacao”> <operation name=”nomeOperacao” pattern=”in-out”> <input message=”msg:MensagemRequisicao”/> <output message=”msg:MensagemResposta”/> </operation> </portType> ● Descreve o que o serviço faz ● As mensagens permitem saber a assinatura dos métodos ● Normalmente um documento WSDL contem apenas um portType por razões de reutilização Componente Mensagem do WSDL ● ● Contém a assinatura das operações descrevendo o nome e os parâmetros da operação Geralmente são definidas duas mensagens para cada operação definida na interface. Uma para requisição: <message name=”MensagemRequisicao”> <part name=”argumento” type=”xsd:string”> </message> ● E outra para resposta: <message name=”MensagemResposta”> <part name=”resultado” type=”xsd:double”> </message> Componente Tipos do WSDL ● Coleção de todos os tipos de dados usados na especificação de um serviço ● ● São declarados num XML Schema Tipos primitivos (int, double) possuem definições equivalentes em XML No entanto, para tipos estruturados utiliza complexType do XML que consiste de sequences para os tipos internos Componente Tipos do WSDL <types> <xsd:schema targetNamespace=http://www.exemplo.com/ns/tipoComplexo xmlns:xsd=http://www.w3.org/2001/XMLSchema> <xsd:element name=”complexo” type=”tipoComplexo” /> <xsd:complexType name=”tipoComplexo”> <wsd:sequence> <xsd:element name=”elemento1” type=”xsd:string”/> <xsd:element name=”elemento2” type=”xsd:double”/> </xsd:sequence> <xsd:attribute name=”id” type=”xsd:positiveInteger” /> </xsd:complexType> </xsd:schema> </types> Bindings do WSDL ● ● A função do binding é tornar concreto o serviço definindo a forma como o mesmo funciona Exemplos: Protocolo de transporte Estilo de invocação Formato da mensagem Representação de dados externa Uma interface WSDL pode ter um mais bindings associados, mas cada documento normalmente só tem um. Bindings do WSDL <binding name=”ExemploBinding” type=”tipoBinding”> <soap:binding style=”rpc” 1 transport=http://schemas.xmlsoap.org/soap/http/> 2 <operation name=”nomeOperacao”> <input> <soap:body use=”encoded”/> 3 </input> <output> <soap:body use=”encoded”/> </output> </operation> </binding> 4 Bindings do WSDL ● ● ● O exemplo mostra um binding que indica que a invocação será do tipo requisição-resposta (linha 1) Na linha 2, o código indica que o protocolo de transporte utilizado será o HTTP As linhas 3 e 4 mostram que o formato da mensagem será o envelope SOAP e que utilizará apenas o corpo (body) Mostram também que a mensagem deverá ser codificada Serviço de diretório UDDI ● ● ● ● Serviço para registro e localização de Web Services Permite informações sobre negócio e serviços sejam eletronicamente publicadas e consultadas. “Register once, published everywhere” Define como os negócios interagem sobre a Internet e compartilham informações em uma arquitetura de registro global. É um framework para integração de Web Services. Serviço de diretório UDDI ● ● ● ● UDDI é uma especificação global. Toda empresa espalhada pelo mundo é capaz de se registrar em um UDDI Business Registry. Business Registry implementa a especificação UDDI. Nos Registries ocorre uma sincronização de seus conteúdos regularmente. Permissões de acesso – Somente o usuário com as credenciais que conferem com as credenciais usadas para criação dos registros podem alterá-los. Serviço de diretório UDDI ● Serviço de nomes permite que se busque um serviço através do nome da empresa ● Serviço de diretório permite que se busque um serviço através do tipo de serviço, produto, localização geográfica ● Conhecido como páginas brancas Conhecido como páginas amarelas Fornece também informações técnicas sobre o serviço exposto(regras de negócio, descrição do serviço,...) Conhecido como páginas verdes Serviço de diretório UDDI ● UDDI armazena informações em quatro estruturas que podem ser acessadas individualmente através de uma chave Serviço de diretório UDDI ● ● ● ● businessEntity: fornece informações sobre a organização que oferece o web service businessServices: armazena os nomes e as descrições de um ou mais web services businessTemplate: guarda o endereço de um web service e referências a descrições de serviços tModel: guarda descrições de serviços, geralmente do tipo WSDL e acessados por meio de URL Serviço de diretório UDDI ● ● ● UDDI fornece uma API para buscar serviços baseados em dois tipos de operações Operações do tipo get para obter informações sobre detalhes de negócios, serviços, bindings, etc. Operaçoes do tipo find para descobrir serviços disponíveis e o conjuntos de empresas que fornecem aquele tipo de serviço Segurança em XML ● ● ● ● Como pode-se observar o XML é um componente fundamental dentro de Web Services É importante que o XML forneça recursos de segurança tais como assinatura digital, encriptação e gerenciamento de chaves Permitir, por exemplo, aplicar diferentes níveis de permissão de acesso em diferentes partes de um documento XML pode fazer isso através da definição de novas tags que definam o começo e o fim de seções codificadas Segurança em XML – Requisitos ● XML deve fornecer pelo menos o mesmo nível de proteção que um TLS (Transport Layer Security) Ser capaz de encriptar um documento inteiro ou apenas parte dele. Ex.: transações financeiras. Ser capaz de fornecer assinatura para um documento inteiro apenas parte dele para garantir autenticidade Autorizar diferentes usuários a visualizarem diferentes partes de um documento Segurança em XML – Requisitos ● ● ● O XML deve fornecer um conjunto padrão de algoritmos para permitir o uso de segurança nos documentos Estes algoritmos devem estar explicitamente referenciados dentro do próprio documento XML XML deve definir elementos (tags, valores) que acessem estes recursos de segurança através de uma URI Algoritmos para assinatura em XML Algoritmos para encriptação em XML ● ● Algoritmos do tipos Block cipher são usados para encriptar dados Base64 é usado para assinatura digital e também encriptação de dados Comparações entre Web services e CORBA ● ● ● No CORBA, é possível obter/publicar a referência de um objeto remoto através do serviço de nomes No Web services, o cliente utiliza o UDDI para obter e publicar a descrição de um serviço web IORs em CORBA podem utilizar um identificador de interface IDL para fornecer informações sobre um objeto remoto gravadas em repositório de informações No entanto cliente e servidor precisam utilizar o mesmo repositório de implementação Comparações entre Web services e CORBA ● ● Impraticável ao tentar utilizar IOR para referenciar um objeto numa rede como a Internet Web services são mais eficientes pois utilizam URL para referenciar um serviço ● Um cliente em qualquer lugar na Internet pode fazer uma requisição ao serviço através da URL Web services são mais fáceis de serem utilizados pois, por exemplo, HTTP e XML já possuem suporte de sistemas operacionais e bibliotecas de linguagem Enquanto CORBA geralmente passa por um difícil processos de instalação Comparações entre Web services e CORBA ● ● Ativação e localização de recursos Em Web services estas duas ações estão bem separadas No CORBA estas ações são feitas pelo repositório de implementação Desempenho CORBA utiliza CDR que é binário e mais eficiente Web services utiliza XML que é textual e portanto mais lento ● Apesar de haver estudos sobre a possibilidade de incluir dados binários no XML para melhor eficiência Comparações entre Web services e CORBA ● ● CORBA é mais recomendado para a criação de aplicações mais complexas e que sejam utilizadas dentro de uma organização ou um pequeno grupo de organizações e que exija um melhor desempenho Web services é para aplicações que sejam projetadas para estar disponíveis, por exemplo, para acesso pela Internet e cujo desempenho não seja o foco principal Web services em Java ● ● ● O desenvolvimento de web services com Java é feito através da API JAX-RPC Esta API oculta todos os detalhes do protocolo SOAP tanto para o cliente quanto para o servidor JAX-RPC mapeia tipos em Java para tipos em XML ● Ex.: Calendar, Date, String, tipos primitivos etc. Permite também que URIs sejam passadas como argumento e resultado Web services em Java ● ● JAX-RPC permite também que classes sejam passadas como argumentos e resultados desde que: Seja um dos tipos permitidos pela API Tenha um construtor padrão (sem argumentos) Não implementem a interface Remote Interfaces em Java que implementam Remote não podem ser passadas como parâmetros Ex.: ShapeList. Exemplo de Interface de Web Service em Java: ShapeList import java.rmi.*; public interface ShapeList extends Remote { int newShape(GraphicalObject g) throws RemoteException; int numberOfShapes()throws RemoteException; int getVersion() throws RemoteException; int getGOVersion(int i)throws RemoteException; GraphicalObject getAllState(int i) throws RemoteException; } Comparar com a interface de um serviço equivalente construído com objetos distribuídos: import java.rmi.*; import java.util.Vector; public interface Shape extends Remote { int getVersion() throws RemoteException; GraphicalObject getAllState() throws RemoteException; } public interface ShapeList extends Remote { Shape newShape(GraphicalObject g) throws RemoteException; Vector allShapes() throws RemoteException; int getVersion() throws RemoteException; } Web services em Java ● A interface Java de um web service deve atender às seguintes regras: Deve estender a interface Remote Não deve ter constantes declaradas Devem lançar exceção do tipo RemoteException Tipos de dados passados e retornados somente aqueles permitidos pela API JAX-RPC Web services em Java - Servidor ● O servidor não possui método principal (main) e não há construtor ● ● Servidor é apenas um objeto que fornece um conjunto de serviços Duas ferramentas chamadas wscompile e wsdeploy são usadas para gerar o skeleton e a descrição do serviço (documento WSDL) Estas informações são obtidas são obtidas de um arquivo de configuração XML Implementação do servidor ShapeList em Java import java.util.Vector; public class ShapeListImpl implements ShapeList { private Vector theList = new Vector(); private int version = 0; private Vector theVersions = new Vector(); public int newShape(GraphicalObject g) throws RemoteException{ version++; theList.addElement(g); theVersions.addElement(new Integer(version)); return theList.size(); } public int numberOfShapes(){} public int getVersion() {} public int getGOVersion(int i){ } public GraphicalObject getAllState(int i) {} } Container de servlets ● Para utilizar web services em Java podemos utilizar um container de servlets ● ● ● Carregar, inicializar e executar servlets Servlets são programas que servem para atender requisições de cliente de dentro de um web server As requisições são passadas para um skeleton através de um despachante O skeleton por sua vez converte a informação para Java e chama o método no servlet Container de servlets - Tomcat ● ● ● O servlet atende a requisição e retorna uma resposta para o skeleton que traduz de volta para o formato SOAP Tomcat é um exemplo de container de servlets bastante utilizado Tomcat fornece acesso para as descrições de serviço do web service contidos nele Container de servlets - Tomcat ● ● ● Facilita a criação de programas cliente e também a compilação de proxys Como a descrição do serviço está em XML é possível ler suas informações diretamente Importante lembrar que o uso de servlets não é obrigatório para o desenvolvimento de web services com Java Web services em Java - Cliente ● ● ● O cliente pode acessar um serviço através de proxy estático ou dinâmico ou por invocação dinâmica O código a seguir usa proxy estático que é gerado pelo programa wscompile a partir da descrição de serviço do servidor O nome é formado pelo nome do serviço acrescentado de _Impl ● Ex.: MyShapeListService_Impl Proxys dinâmicos são criados em tempo de execução também a partir da descrição de serviço e não especifica nenhuma regra de nome Implementação do cliente do serviço web ShapeList em Java package staticstub; import javax.xml.rpc.Stub; public class ShapeListClient { public static void main(String[] args) { /* pass URL of service */ try { Stub proxy = createProxy(); 1 proxy._setProperty 2 (javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, args[0]); ShapeList aShapeList = (ShapeList)proxy; 3 GraphicalObject g = aShapeList.getAllState(0); 4 } catch (Exception ex) { ex.printStackTrace(); } } private static Stub createProxy() { 5 return (Stub) (new MyShapeListService_Impl().getShapeListPort()); 6 } } Web services em Java - Cliente ● ● ● ● Na linha 1 o proxy estático é criado As linhas 5 e 6 mostram o método responsável pela criação do proxy Na linha 2, a URL do servidor é fornecida para o proxy através do argumento passado pela linha de comando (args[0]) Na linha 3, o proxy é convertido para o tipo ShapeList e a linha 4 ocorre a chamada do método getAllState() que retorna um objeto gráfico Invocação dinâmica e implementação do Java SOAP ● Invocação dinâmica de interface permite executar uma operação mesmo sem conhecimento de nome e assinatura em tempo de execução ● ● Obtém o nome e a assinatura por um conjunto de operações A implementação do SOAP no Java pode ser explicada com base na arquitetura RMI Os módulos de comunicação (cliente e servidor) utilizam o protocolo HTTP Implementação do Java SOAP ● ● ● ● Módulo de comunicação do servidor seleciona o despachante com base na URL fornecida na mensagem de requisição Proxy conhece a URL do serviço, cria a mensagem e faz o marshalling para o XML. Depois recebe a resposta, faz o unmarshalling e retorna o resultado da requisição Despachante que recebe a mensagem de requisição e redireciona para o skeleton apropriado Skeleton que valida a mensagem, faz o unmarshalling e executa a operação