Web Services SOAP
Introdução
1
Cenários Problemáticos
Soluções para aplicações corporativas avançadas
– Cenário 1: Portal de Turismo
– Cenário 2: Compra Automática
– Cenário 3: Supply Chain Management
– Cenário 4: Pesquisa Google via Programa
2
Cenário 1: Portal de Turismo
Implementar um portal realmente automático em que: – O cliente lista seus desejos via HTML – O portal
• pesquisa alternativas
• escolhe as melhores
• faz todas as reservas
• fatura o cartão de crédito do cliente
• efetua todos os pagamentos
• ... automaticamente, sem intervenção humana
Ou seja, queremos que programas naveguem na Web, não só humanos
3
Cenário 2: Compra automática
Implementar uma aplicação para um distribuidor regional de remédios que:
– Automaticamente detecte estoque baixo
– Procure o melhor lugar no mundo para comprar os produtos
• Preço, prazo de entrega, etc.
– Emita a ordem de compra eletronicamente
4
Cenário 3: Supply Chain
Management
Implementar aplicações de SCM que integrem sistemas de várias empresas (fornecedores, parceiros, clientes, ...)
5
Cenário 4: Pesquisa Google via
Programa
Escrever um programa que recupere as primeiras 10 ocorrências de “web services” retornadas pelo Google
6
Características comuns aos
cenários Todos são sistemas distribuídos
Todos funcionam na Internet
Vários envolvem achar (navegar) o que se quer antes de usar
Todos envolvem domínios administrativos diferentes (empresas diferentes)
– Não temos controle sobre a plataforma, linguagem, etc. do outro lado
– O outro lado é essencialmente um sistema legado no qual não podemos mexer
7
Problemas técnicos resultantes
1. Como trocar informação em ambiente heterogêneo para que ambos os lados entendam?
2. Como acessar a funcionalidade remota?
3. Como achar o “outro lado”?
4. Como driblar firewalls na comunicação?
8
Uma Solução – Web Services
1. Como trocar informação em ambiente heterogêneo para que ambos os lados entendam? • Usar XML para toda a comunicação
• Usar SOAP fazer RPC
2. Como saber que “métodos” podem ser chamados e com que parâmetros? – Usar uma arquitetura orientada a serviços – Descrever o serviço remoto usando WSDL – Definir ontologias
3. Como achar o “outro lado”? – Usar UDDI para localizar serviços
4. Como driblar firewalls na comunicação? • Usar binding de SOAP para HTTP
9
Modelo de dados que
representa um
conjunto de conceitos
de um domínio e os
relacionamentos
entre estes.
Usada para realizar
inferência sobre os
objetos do domínio.
Uma imagem vale 1000 palavras
10
Vamos descrever melhor a
solução ...
11
Usar uma arquitetura orientada a
serviços Serviço oferece uma API na Internet
12
Usar XML para toda a
comunicação Extended Markup Language (XML) Oferece um formato ASCII para trocar qualquer tipo de
informação estruturada Usa o “estilo” HTML de markup com tags
– <pessoa nome=”João”> <frutasFavoritas> <fruta>Manga</fruta> <fruta>Maçã</fruta> <fruta>Uva</fruta> </frutasFavoritas> </pessoa>
Os tags podem ser definidos para criar uma “Aplicação XML” ou “Linguagem XML”
13
Usar SOAP fazer RPC
SOAP é uma forma de fazer Remote Procedure Call (RPC) usando documentos XML
14
Descrever o serviço remoto
usando WSDL
WSDL = Web Services Description Language
Pronunciado “wisdle”
É uma linguagem XML que contém informação sobre a interface, a semântica, e outros detalhes de chamadas a um Web Service
15
Descrição WSDL inclui
Descrição/formato de mensagens que podem ser passadas – Elementos <types>, <message>
Semântica da passagem de mensagens (Request-only, request-response, response-only) – Dentro do elemento <portType>
Uma codificação usando um transporte particular – Elemento <binding>
O endpoint do serviço (uma URL) – Dentro do elemento <service>
Veremos um exemplo logo
16
Definir ontologias
Precisamos saber o que as coisas significam
Exemplo: como mandar uma ordem de serviço se não sei o que cada campo deve conter?
Várias organizações definem e padronizam ontologias – ebXML
– Oasis
17
Usar UDDI para localizar serviços
UDDI = Universal Description, Discovery, and Integration
Permite cadastrar serviços e localizá-los
Não é necessário usar UDDI se o cliente já tiver o documento WSDL
– Não usaremos UDDI no exemplo que segue
18
Usar binding de SOAP para HTTP
O binding sobre HTTP, SMTP, etc. permite driblar firewalls com mais facilidade
Qualquer outro protocolo de transporte pode ser usado
19
Finalmente ... O que é um Web Service?
Um Web Service é um ponto de acesso a funcionalidade que pode ser
– Localizado dinamicamente
– Ter sua interface descoberta automaticamente, porque o serviço sabe se descrever
– Ser chamado na Web
20
21
Situações de uso de SOAP
Processamento e chamadas assíncronos:
– aplicação precisa de um nível garantido de confiabilidade e segurança para a troca de mensagens;
Contratos formais:
– ambos os lados (fornecedor e consumidor) têm que concordar com o formato de intercambio de dados, onde SOAP fornece especificações rígidas para esses tipo de interação;
Operações stateful:
– a aplicação precisa de informação contextual e gerenciamento de estado com coordenação e segurança
22
Web Service SOAP
Tecnologias Relacionadas
Web Services
SOAP (Simple Object Access Protocol)
HTTP (HyperText Markup Language)
UDDI (Universal Description, Discovery and Integration)
XML (eXtensible Markup Language)
XSD (XML Schema Documents)
SOAP
Protocolo elaborado para facilitar a chamada remota de funções via Internet, permitindo que dois programas se comuniquem de uma maneira tecnicamente muito semelhante à invocação de páginas Web.
25
SOAP
Vantagens sobre outras maneiras de chamar funções remotamente como DCOM, CORBA ou diretamente no TCP/IP:
– simples de implementar, testar e usar
– padrão da indústria
– Usa mesmos padrões da Web :
• comunicação via HTTP;
• mesmos protocolos de autenticação e encriptação;
• manutenção de estado da mesma forma;
• normalmente implementado pelo próprio servidor Web.
26
SOAP
Vantagens sobre outras maneiras de chamar funções remotamente como DCOM, CORBA ou diretamente no TCP/IP:
– Atravessa “firewalls” e roteadores, que “pensam” que é uma comunicação HTTP.
– Tanto os dados como as funções são descritas em XML, o que torna o protocolo não apenas fácil de usar como também muito robusto.
– É independente do sistema operacional e CPU.
– Pode ser usado tanto de forma anônima como com autenticação (nome/senha).
27
Pedidos SOAP
Os pedidos SOAP podem ser feitos em três padrões: GET, POST e SOAP.
– GET e POST idênticos aos pedidos feitos por navegadores Internet.
– SOAP padrão semelhante ao POST, mas com pedidos em XML que permitem recursos mais sofisticados como passar estruturas e arrays.
As respostas são sempre em XML.
O XML descreve perfeitamente os dados em tempo de execução e evita problemas causados por mudanças nas funções, já que os objetos chamados têm a possibilidade de sempre validar os argumentos das funções, tornando o protocolo muito robusto.
28
WSDL
Web Services Definition Language
29
WSDL
Uma definição:
– A WSDL é uma especificação que permite descrever Web Services segundo um formato XML.
Descrição dos Serviços
Através da descrição do Web Services o provedor de serviços publica as especificações necessárias para o cliente invocar um serviço.
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.
Em suma...
Um documento WSDL é um documento XML que descreve Web Services como um conjunto de pontos de serviço (endpoints) que operam baseados em trocas de mensagens.
As operações e mensagens relativas a um serviço são descritas de forma abstrata e em seguida ligados a protocolos de rede e formatos de mensagens concretos como o objetivo de definir um ponto de serviço .
WSDL é extensível
WSDL é uma linguagem extensível e permite a descrição de pontos de serviço e suas mensagens independentemente de que formato de mensagens ou protocolo de rede é utilizado na comunicação.
Linguagem para definição de web
service - WSDL
Descreve perfeitamente os objetos e métodos disponíveis, através de páginas XML acessíveis através da Web.
Quem publicar um serviço, cria também estas páginas.
Quem quiser chamar o serviço, pode usar estas páginas como “documentação” de chamada e também usadas antes de chamar as funções para verificar se alguma coisa mudou.
35
WSDL – Web Services Definition Language
A camada de integração introduzida pela estrutura de web services estabelece um padrão, reconhecido e com interface programática suportada.
WSDL permite a comunicação entre essas camadas ao fornecer descrições padronizadas.
36
WSDL – definiçao de serviços
Uma definição de serviço, tal como é expressa pelo construtor definitions
37
Arquitetura WS
Camadas
– Descoberta
– Publicação (UDDI /direta)
– Descrição dos serviços (WSDL)
– Troca de Mensagens baseadas em XML (SOAP)
– Rede (HTTP, SMTP, FTP)
Interface e Implementação
O uso de WSDL na arquitetura de Web Services é em geral dividido em duas partes:
– interface do serviço
– implementação do serviço.
Cada parte pode ser definida de maneira independente e conseqüentemente reutilizada por outras aplicações.
Interface de Serviço
Especificação de interface de serviço é uma descrição de serviço reutilizável que pode ser instanciada e implementada por diferentes implementações de serviços.
Semelhante a IDL (CORBA).
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 indica-se o uso de XSD (XML Schema Documents)
<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>
Mensagens (message)
– Representam uma definição abstrata dos dados que serão transmitidos. Uma mensagem é composta por diferentes partes lógicas que estão associadas com uma definição contida em um sistema de tipos.
<message name=“itemInformation”>
<part name=“theElement” element=“aliarForItem” />
</message>
Elementos da Interface de Serviço
Tipos de portas (portType)
– São conjuntos de operações abstratas, cada uma contendo mensagens de entrada e saída.
.... >
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType> ...
Elementos da Interface de Serviço
Operações (operation)
– Definição abstrata de uma ação que um serviço pode executar
.... >
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType> ...
Elementos da Interface de Serviço
Ligações (binding) – Especificam protocolos concretos além de especificações
de formatação de dados para as operações e mensagens definidas em um tipo de porta particular.
<binding name="StockQuoteSoapBinding“
type="tns:StockQuotePortType">
<soap:binding style="document“
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
Elementos da Interface de Serviço
Implementação do Serviço
A implementação de serviço é um documento WSDL que descreve como uma interface particular é implementada por um determinado provedor de serviços. Os elementos que fazem parte da implementação do serviço são ports e services.
Implementação do Serviço
Porta (port)
– Especifica um endereço para uma ligação, definindo então um endpoint único.
<port name="StockQuotePort“
binding="tns:StockQuoteBinding">
<soap:address
location="http://example.com/stockquote"/>
</port>
Implementação do Serviço
Serviço (service)
– Modela um Web Service agregando um conjunto de portas relacionados entre si.
<wsdl:definitions .... >
<wsdl:service name="nmtoken">
<wsdl:port .... />
</wsdl:service>
</wsdl:definitions>
WSDL
As definições de interface e implementação de serviços podem fazer parte de um mesmo documento WSDL .
Um documento WSDL contém elementos que possuem significado para um Web Service.
Elementos da WSDL para seu
XSD
definitions documentation message portType input output fault operation service binding port
Estrutura de um Documento WSDL
• Um documento WSDL é um conjunto de
definições. Há um elemento “definitions”
na raiz e outras definições no interior
This example uses a fixed XML format instead of the SOAP encoding
Example 1 SOAP 1.1 Request/Response via HTTP [2]
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl“
xmlns:tns="http://example.com/stockquote.wsdl“
xmlns:xsd1="http://example.com/stockquote.xsd“
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/“
xmlns="http://schemas.xmlsoap.org/wsdl/">
<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">
Definitions:
Define a raiz do
documento WSDL
types:
Define os tipos de dados
que serão utilizados para
trocar mensagens
types:
Indica-se
o padrão
XSD
Cont.
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<fault name= “..... />
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
message:
Definição abstrata
dos dados enviados
e recebidos
portType:
Define um conjunto de
operações disponíveis em
uma determinada porta operation:
Nomeia as operações de
entrada e saída e ainda
podem descrever erros
(fault)
fault:
Leyout de retorno
de qualquer falha
Cont.
<binding name="StockQuoteSoapBinding“
type="tns:StockQuotePortType">
<soap:binding style="document“
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service
</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
binding:
Especifica o protocolo e o
formato de dados para
operações e mensagens
definidas por uma portType Input/output:
Descreve os elementos que
uma operação usa como
parâmetros de entrada e
saída
service:
Modela um Web Services
agregando um conjunto de
portas relacionadas
documentation:
Textos ou elementos
adicionais, informativos,
utilizados para documentação
port:
Especifica o
endereço de um
binding
Referências
[1] Seely, Scott. SOAP: Cross Platform, Web Services Development, Using XML. New York: Prentice Hall, 2002.
[2] W3C. Web Services Description Language (WSDL) 1.1, [online], 05/06/2002, http://www.w3.org/tr/2001/NOTE=wsdl-20010315.
Criando um Web Service SOAP
56
Criando Web Services em SOAP
Serviços Web são definidos por classes.
Um Web Service pode oferecer várias operações, cada uma representada por um método de classe.
Uma prática importante: dividir a interface de um serviço da sua implementação.
– interface de um serviço: SEI (Service Endpoint Interface) e
– a implementação: SIB (Service Implementation Bean).
Criando o Web Service ALO
Crie a interface do serviço
@Webservice: avisa ao compilador Java que o arquivo atual
corresponde à definição SEI de um serviço Web
@WebMethod indica que um determinado método corresponde a uma operação de serviço e assim pode ser invocado por um cliente
@SOAPBinding indica que o serviço utilizará a abordagem SOAP
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Alo {
@WebMethod public String alo (@WebParam(name = "nome") String
txt);
}
Criando a Implementação do Serviço
ALO Criar a implementação da interface: a SEI onde serão
implementados os métodos definidos anteriormente
@WebService(endpointInterface = "alo.Alo")
public class AloServer implements Alo{
public String alo (@WebParam(name = "nome") String txt) {
return "Olá " + txt + " !";
}
}
Publicando o Serviço
Endpoint : permite publicar um serviço em um servidor. Parâmetros:
– o endereço do servidor e
– a instância do SIB do serviço a ser publicado.
– O serviço é publicado na porta 9875.
public class AloPublish {
public static void main(String[] args) {
Endpoint.publish("http://localhost:9875/alo", new AloServer());
}
}
Usando o serviço
indicando o WSDL onde o serviço poderá ser encontrado
public class AloClient {
public static void main(String args[]) throws Exception {
URL url = new URL("http://127.0.0.1:9875/alo?wsdl");
QName qname1 = new QName("http://alo/", "AloServerService");
Service ws1 = Service.create(url, qname1);
Alo cS = ws1.getPort(Alo.class);
System.out.println("Resultado " + cS.alo("Macacada"));
}
}
Usando o serviço
Nome qualificado em XML para QName.
Indica uma URI (namespace) e o nome do serviço.
– Namespace: fornecido pela WSDL do serviço, e
– Nome local: classe SIB acrescida da palavra “Service”. O nome local aparece na última seção do documento WSDL (seção service).
public class AloClient {
public static void main(String args[]) throws Exception {
URL url = new URL("http://127.0.0.1:9875/alo?wsdl");
QName qname1 = new QName("http://alo/", "AloServerService");
Service ws1 = Service.create(url, qname1);
Alo cS = ws1.getPort(Alo.class);
System.out.println("Resultado " + cS.alo("Macacada"));
}
}
Usando o serviço
retorna uma referência a um objeto que pode invocar as operações oferecidas pelo serviço
public class AloClient {
public static void main(String args[]) throws Exception {
URL url = new URL("http://127.0.0.1:9875/alo?wsdl");
QName qname1 = new QName("http://alo/", "AloServerService");
Service ws1 = Service.create(url, qname1);
Alo cS = ws1.getPort(Alo.class);
System.out.println("Resultado " + cS.alo("Macacada"));
}
}
Usando o serviço
Acesso a interface de ponto final (endpoint)
– tipo SEI do serviço, sendo capaz de acessar seus métodos.
O cliente poderia ter sido implementado em qualquer linguagem de programação como C, C++, PERL ....
public class AloClient {
public static void main(String args[]) throws Exception {
URL url = new URL("http://127.0.0.1:9875/alo?wsdl");
QName qname1 = new QName("http://alo/", "AloServerService");
Service ws1 = Service.create(url, qname1);
Alo cS = ws1.getPort(Alo.class);
System.out.println("Resultado " + cS.alo("Macacada"));
}
}
65
Exercício: Calculadora
www.linhadecodigo.com.br
Desenvolvendo e usando web services em java
66
Exemplo: Calculadora @WebService
@SOAPBinding(style = Style.RPC)
public interface CalculadoraS {
@WebMethod
float soma(float num1, float num2);
@WebMethod
float subtracao(float num1, float num2);
@WebMethod
float multiplicacao(float num1, float num2);
@WebMethod
float divisao(float num1, float num2);
}
Exemplo: Calculadora @WebService(endpointInterface = "calc.CalculadoraS")
public class CalculadoraSImpl implements CalculadoraS {
public float soma(float num1, float num2) {
return num1 + num2;
}
public float subtracao(float num1, float num2) {
return num1 - num2;
}
public float multiplicacao(float num1, float num2) {
return num1 * num2;
}
public float divisao(float num1, float num2) {
return num1 / num2;
}
}
Exemplo: Calculadora public class CalculadoraSPublish {
public static void main(String[] args) {
Endpoint.publish("http://localhost:9876/calc",
new CalculadoraSImpl());
}
}
Exemplo: Calculadora class CalculadoraClient {
public static void main(String args[]) throws Exception {
URL url = new URL("http://127.0.0.1:9876/calc?wsdl");
QName qname = new
QName("http://calc/","CalculadoraSImplService");
Service ws = Service.create(url, qname);
CalculadoraS calc = ws.getPort(CalculadoraS.class);
System.out.println("Soma (5+1): " + calc.soma(5,1));
System.out.println("Subtracao (5-1): " + calc.subtracao(5,1));
System.out.println("Multiplicacao (5*1): " + calc.multiplicacao(5,1));
System.out.println("Divisao (5/1): " + calc.divisao(5,1));
}
}