Autores
Sérgio Mergen Cláudio Geyer
Emanuel Müller Ramos
Local
Instituto de Informática – UFRGS Versão
V20
Maio 2010 cursos:
Sistemas Operacionais II
Súmula
conceitos gerais sobre Web Services conceitos de SOAP
Introdução à biblioteca Axis WS no J2EE
conceitos de WSDL conceitos de UDDI
Observações
Bibliografia
Coulouris, G. Et al. Sistemas Distribuídos – Conceitos e Projeto.
Bookman, 2007.
Cap. 19
CERAMI Ethan. Web Services Essentials - Distributed Applications
with XML-RPC, SOAP, UDDI & WSDL. O'Reilly, 2002.
NEWCOMER Eric. Understanding Web Services: XML, WSDL,
SOAP, and UDDI. David Chappell Series Editor. 2002.
Wutka, M. Special Edition Using Java 2 Enterprise Edition. QUE,
2001.
capítulo 25
Tutoriais da Sun para J2EE e do NetBeans
Links
Atividades do W3 em Web Services
http://www.w3.org/2002/ws/
XML Protocol Working Group
http://www.w3.org/2000/xp/Group/
Projetos WS do grupo Apache
http://ws.apache.org/
Implementações de Java SOAP
Axis 2
http://ws.apache.org/axis2/ Axis 1
Links
Links SOAP do W3
SOAP Message Transmission Optimization Mechanism
http://www.w3.org/TR/soap12-mtom
SOAP Resource Representation Header
http://www.w3.org/TR/soap12-rep
SOAP Version 1.2 Part 0: Primer
http://www.w3.org/TR/soap12-part0/
SOAP Version 1.2 Part 1: Messaging Framework
Links
Links SOAP do W3
SOAP Version 1.2 Part 2: Adjuncts
http://www.w3.org/TR/soap12-part2/
SOAP Version 1.2 Specification Assertions and Test
Collection
Links
Links WSDL do W3
Semantic Annotations for WSDL and XML Schema
http://www.w3.org/TR/sawsdl
Web Services Description Language (WSDL) Version 2.0
Part 0: Primer
http://www.w3.org/TR/wsdl20-primer
Web Services Description Language (WSDL) Version 2.0
Part 1: Core Language
http://www.w3.org/TR/wsdl20
Web Services Description Language (WSDL) Version 2.0
Part 2: Adjuncts as Recommendation.
Súmula
Conceitos gerais sobre Web Services
motivação para o uso de Web Services
definição arquitetura
componentes
Súmula
Conceitos de SOAP
Introdução ao SOAP
Vantagens do SOAP
Desvantagens do SOAP
Estrutura de uma mensagem SOAP
Exemplo de WS/SOAP com Apache Axis
Súmula
WS no J2EE Características Tipos JAX-WS RESTFul WSDL UDDI
A Internet Tradicional
Ótima forma para troca de informações Independência de plataforma
Abstração do hardware, software e sistema operacional
utilizados
Problemas:
WWW era centrada no ser humano
pessoas acessam, modificam, inserem e removem
documentos remotos
Aplicações que desejavam trocar informações pela Web
necessitavam utilizar soluções ad-hoc
Necessidade de estender a Web para suportar esse novo tipo de
interação
Web Services – Objetivos
Permitir uma comunicação fácil entre diferentes aplicações
utilizando a estrutura já existente da Web
Determinam um conjunto de mecanismos (padrões, especificões,
etc.)
que permitam estender a Internet
para aceitar a troca de informações entre aplicações
Adicionalmente: permitir que aplicações descubram
automaticamente qual serviço elas desejam utilizar
Chamada automática de serviços
Sem nenhuma intervenção do ser humano
Web Services – Conceito
Um Web Service é uma aplicação que:
Está disponível através da Internet
Utiliza padrões baseados em XML para descrever as
mensagens enviadas e recebidas, bem como seus dados
É independente de hardware, sistema operacional e
linguagem de programação
Pode ser descrita utilizando XML (WSDL)
Pode ser encontrada facilmente (usando UDDI por
exemplo)
OBS.:
Web Services baseados na arquitetura REST (REST WS)
não seguem exatamente esses conceitos
Exemplo Básico
- Linguagens Java e C - SOs Windows e Linux - Mensagem XML
Arquitetura
Pode ser descrita de duas formas
Pelos componentes que a compõem
Pilha de Protocolos
Nível de transporte
Responsável por transmitir os dados entre as aplicações
Pode utilizar protocolos já disponíveis pela internet (HTTP, SMTP,
FTP, etc.)
Nível de mensagem
Define o formato das mensagens enviadas entre as aplicações Obs.:
Formato XML puro não garante interoperabilidade entre
Nível de descrição
Representa a interface de um Web Service aos clientes
Nome das operações disponíveis
Parâmetros
Protocolos do nível de transporte utilizados
Etc
Nível de descoberta
Súmula da parte SOAP
Conceitos de SOAP
Introdução ao SOAP
Vantagens do SOAP
Desvantagens do SOAP
Estrutura de uma mensagem SOAP
Exemplo de WS/SOAP com Apache
O que é SOAP?
Protocolo para troca de mensagens distribuídas
Pode ser usado como o nível de mensagem da arquitetura
WS
Concorrente de IIOP (Corba), JRMP (Java RMI), XML-RPC,
REST-WS e outros
Proposto a IETF e ao W3
W3: World Wide Web Consortium
IETF: organização que publica padrões para Internet como
TCP, FTP, HTTP, …
Especificação inicial desenvolvida por
Microsoft, IBM/Lotus, Don Box (guru COM), Dave Winer
Características do SOAP
Baseado em tecnologias já existentes
HTTP, SMTP como nível de transporte
XML
Utiliza mensagens no formato XML Unidirecional
Sem estado
Não define um modelo de objetos
Não define um modelo para troca de mensagens Não está necessariamente ligado a Web Services
Características do SOAP
Quando usado em chamada de WS
Aplica modelo requisição – resposta (cliente/servidor) com 2
mensagens SOAP
Chamada pode ser:
Síncrona (normal em RPC) Assíncrona
Vantagens do SOAP
Firewall Friendly
uso de protocolos Web como HTTP
Infraestrutura já conhecida Amplo suporte a XML
Suportado por grandes organizações
Vantagens SOAP
Independe de linguagem (se utilizado seguindo corretamente os
padrões)
RMI: só Java
observação: RMI-IIOP permite Java x linguagens com
IIOP
IIOP: exige biblioteca IIOP para a linguagem
SOAP:
somente um parser XML
mais biblioteca para envio de requisições HTTP
Independe de plataforma
permitiria ponte entre mundos Linux e Microsoft
obs: RMI e CORBA oferecem essa ponte, mas não com o
Desvantagens SOAP
Brechas na segurança
WS-Security tenta resolver esses problemas
http://www.oasis-open.org/committees/tc_home.php?
wg_abbrev=wss
Problemas de performance
menos rápido que atuais competidores tipo RPC como
RMI (Java), IIOP (CORBA), DCOM e Remote (Microsoft)
mais lento mesmo comparado a competidores que são
baseados em XML (XML-RPC, REST-WS)
Muito complexo: overhead –
aplicações geralmente não necessitam de tantas
Desvantagens SOAP
Não oferece serviços avançados
A revisar conforme novos padrões Web Services
Como CORBA, J2EE, …
CORBA possuía mais de 20 serviços como persistência,
transações, real-time, aluguel de objetos, ...
Não possui noção de objeto com estado como em RMI Não suporta passagem por referência
Versões
SOAP 1.2
http://www.w3.org/TR/2007/REC-soap12-part0-20070427/
SOAP 1.1
Especificação (estrutura geral dos documentos)
Parte 1:
define o envelope, um framework geral para definir o
conteúdo de uma mensagem
Também define os protocolos de ligação e o mapeamento
para um protocolo inferior
Parte 2:
Define um modelo de dados para o SOAP
Representação de recurso
Especifica um bloco de cabeçalho, no qual há a
representação de um recurso Web
Envelope: define o começo da
mensagem SOAP
Header: possui informações
específicas da aplicação Dados de autenticação Número de transação Etc.
opcional
Body: contém a mensagem
propriamente dita
Contém dados que devem ser
POST /Temperature HTTP/1.1X Host: www.weather.com Content-Type: text/xml Content-Length: <whatever> SOAPMethodName: <some-URI>#CurrentTemp <SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1"> <SOAP:Body> <m:CurrentTemp xmlns:m="some-URI"> <zip_code>37919</zip_code> <m:CurrentTemp> </SOAP:BODY> <SOAP:Envelope> Http Header Soap Extensions Xml Payload argumento Sem header
HTTP/1.1 200 OK Content-Type: text/xml Content-Length: <whatever> <SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1"> <SOAP:Header> <t:Transaction xmlns:t="some-URI"> 5 </t:Transaction> </SOAP:Header> <SOAP:Body> <m:CurrentTempResponse xmlns:m="some-URI"> <return>42</return> </m:CurrentTempResponse> </SOAP:Body> </SOAP:Envelope> Http Header Xml Payload resposta Com header
Estrutura XML das mensagens SOAP
inicialmente complexa como exemplos anteriores eliminando as informações de namespace como
<SOAP:Envelope
xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
o resto é simples e legível (?)
Implementação Apache Axis
para Java
baseada em implementação anterior Apache SOAP conjunto de
bibliotecas clientes
bibliotecas para o servidor
servlet para processamento das chamadas
Classe servidora
Implementação Apache
programa cliente usa as suas bibliotecas para empacotar a
chamada (request)
Diferentes níveis de abstração dependendo da abordagem
utilizada
servidor
decodifica a chamada
chama o método do objeto servidor
e empacota o resultado para o cliente
Exemplo Hello
especificação
cliente
realiza uma chamada SOAP a uma operação de um
servidor Hello servidor
Interface: 2 (duas) operações
responde à chamada de saudação
Exemplo Hello
codificação do cliente duas aproximações
criar chamada manualmente
parte mais complexa
uso de vários métodos do pacote SOAP
criação da chamada
inclusão de cada argumento da chamada
utilizar o arquivo WSDL (se disponível)
WSDL: descrição (opcional) de um WS em xml
aproximação estática (geração de Stubs) ou dinâmica
Exemplo Hello
código do cliente – codificação manual trabalhosa import java.io.*; import java.net.*; import java.util.*; import org.w3c.dom.*; import org.apache.soap.*; import org.apache.soap.encoding.*; import org.apache.soap.encoding.soapenc.*; import org.apache.soap.rpc.*; import org.apache.soap.util.xml.*;
public class GetHello {
public static void main(String[] args) throws Exception {
// The URL for the SOAP servlet (servidor WS)
URL url = new URL("http://localhost/soap/servlet/ rpcrouter");
// Create a new call
Call call = new Call();
// Tell SOAP which object you want (qual serviço)
call.setTargetObjectURI("urn:HelloApp");
// Tell SOAP which method to invoke
// Tell SOAP to use the regular SOAP encoding style call.setEncodingStyleURI
(Constants.NS_URI_SOAP_ENC);
// Create a vector to hold the method parameters
Vector params = new Vector();
// Add a string parameter called extra1 with a value of "Hello info“
// Specify null for the encoding style
params.addElement(new Parameter("extra1", String.class, "Hello info", null));
// Add an int parameter called extra2 with a value of 123
// Specify null for the encoding style
params.addElement(new Parameter("extra2", Integer.class, new Integer(123), null));
// Store the parameters in the request
call.setParams(params);
// Prepara uma variável para a resposta
// Invoke the call method try { resp = call.invoke(url, ""); } catch (SOAPException e) { e.printStackTrace(); System.exit(0); }
// See if the response contains an error if (!resp.generatedFault())
{
// If not, get the return value
Parameter ret = resp.getReturnValue();
// Expect it to be a string
String value = (String) ret.getValue(); System.out.println(value);
else {
Fault fault = resp.getFault();
System.err.println("Generated fault: "); System.out.println (" Fault Code = " + fault.getFaultCode());
System.out.println (" Fault String = " + fault.getFaultString());
} } }
Hello WSDL Axis WSDL2Java Arquivo WSDL Hello Service .java Hello Service Locator .java Hello Port .java Hello BindingStub .java Stubs Gerados
Código do cliente – geração de Stubs
Outra alternativa para codificação
Axis gera automaticamente classes para acessar o Web Service baseados em
SOAP/WSDL
A partir dessas classes, o desenvolvedor necessita apenas instanciá-las para
Código do cliente – geração de Stubs
import HelloServiceLocator; import HelloService;
import HelloPort;
import HelloBindingStub; public class GetHello
{
public static void main(String[] args) throws Exception {
// localize the service; uso de métodos das classes geradas
HelloService locator = new HelloServiceLocator(); HelloPort port = locator.getHelloPort();
//execute the remote method
String result = port.getHello(“Hello Info”, new Integer(123)); System.out.println(result);
Exemplo Hello
código do servidor
// standard Java
public class SoapHello {
protected String helloString; public SoapHello()
{
helloString = "Hello!"; }
public String getHello(String extra1, int extra2) {
return helloString+" "+extra1+" "+extra2; }
public void setHello(String newHello) {
helloString = newHello; }
Publicando o servidor utilizando Apache Axis
Duas formas principais
Salvar código do servidor na pasta raiz do Axis com a
extensão .jws – instalação instantânea
Extremamente simples;
Necessita do código fonte (e não o binário);
Web service é gerado no instante em que o cliente o
acessa: baixo desempenho;
Utilizar um arquivo de configuração WSDD (Web Service
Deployment Descriptor)
Mais complicado;
SOAP XML-RPC Protocolo de transporte qualquer um (preferência para HTTP) somente HTTP
Tipos extensível utilizando XML Schema restritos a um conjunto básico Ordem de parâmetros indiferente importante
Complexidade complicado simples
Pacote da Sun para Web Services
Obs.: em 2006
nome: JWSDP - Java Web Services Developer Pack 1.2 link http://java.sun.com/webservices/index.jsp agora: http://java.sun.com/webservices/downloads/ previous/webservicespack.jsp anteriormente: http://java.sun.com/webservices/downloads/ webservicespack.html
Pacote da Sun para Web Services
conteúdo (obs. Versão 1.2):
JavaServer Faces (JSF) v1.0 EA4
XML and Web Services Security (xws-security) v1.0 EA
Java Architecture for XML Binding (JAXB) v1.0.1
Java API for XML Processing (JAXP) v1.2.3
Java API for XML Registries (JAXR) v1.0.4
Java API for XML-based RPC (JAX-RPC) v1.1 EA
SOAP with Attachments API for Java (SAAJ) v1.2 EA
JavaServer Pages Standard Tag Library (JSTL) v1.1 EA
Java WSDP Registry Server v1.0_05
Pacote Sun Web Services
pacote testado com
plataformas
Sun Solaris Operating Environment 8 and 9
Windows 2000 Professional Edition
Windows XP Professional Edition
RedHat Linux 8.0
ambiente Java
Java 2 SDK, Standard Edition version 1.4.1_02
plataforma de desenvolvimento e execução
WS no J2EE
Tecnologias incluídas
JAX-WS
Java API para XML Web Services JAX-RS
Java API para RESTFul Web Services
Conceito WS
São aplicações cliente / servidor
Comunicando sobre o protocolo HTTP
WS no J2EE
Características
Interoperabilidade via padrões
Portabilidade sobre diversas plataformas e frameworks Extensíveis
Descrições processáveis graças a XML
Combináveis de forma leve para obter operações complexas
Tipos
“Big” WS
RESTFul WS
WS no J2EE
“Big” WS
Uso de XML e SOAP
Descrição dos serviços em WSDL (linguagem em XML) opcional
Adotado por diversas ferramentas como NetBeans IDE
WS no J2EE
“Big” WS
Elementos principais Contrato formal
Descreve a interface
Mensagens, operações, localização do WS, ligações Arquitetura
Tratar diversos requisitos complexos não funcionais Transações, segurança, endereçamento, confiança,
cordenação, ...
Processamento e chamada assíncronos
WS no J2EE
RESTFul
Representational State Transfer
Apropriado para cenários básicos e ad doc
Melhor integração com HTTP que serviços SOAP Não exigem mensagens XML nem WSDL
Uso do projeto Jersey
Segue padrão: JSR 311 JAX-RS Permite anotações
Mais funcionalidades extra JSR 311 Mais leves
Exigem poucas ferramentas
Também integrado no NetBeans IDE
WS no J2EE
RESTFul
Usos reais
Muitos sites de blogs
Download de arquivos XMl em formato RSS com listas de
links
Amazon Simple Storage Service (S3)
WS no J2EE
RESTFul
Apropriado em/se WS sem estado
Teste: interação sobrevive a queda / “colocar-no-ar” do
servidor (restart)
Infra-estrutura de cache pode ser mais simples Quando dados de retorno são estáticos
Técnicas de cache do servidor web mais simples Cuidado: em geral limitado a método GET do HTTP
WS no J2EE
RESTFul
Apropriado em/se
Contrato liente (consumidor) e serviço (produtor) em
formato ad hoc
Sobre contexto e conteúdo
Muitos serviços distribuem toolkits com
Descrição de interfaces em linguagens
populares
Quando banda é limitada
Por exemplo para PDAs e smartphones SOAP é “pesado”
WS no J2EE
RESTFul
Apropriado em/se
Agregação de serviços é simples Via uso de tecnologias como
JAX-RS
AJAX: Asynchronous JavaScript com XML Toolkits como DWR (Direct Web Remoting) Serviços já existentes podem ser expostos via
páginas HTML sem muito esforço
Desenvolvimento mais produtivo Não é uma “nova” tecnologia
WS no J2EE
Big WS x RESTFul
Usar JAX-WS quando
Aplicação necessita de vários requisitos de QoS Usualmente em aplicações coorporativas
Mais fácil o uso de padrões de segurança e confiabilidade Melhor interoperabilidade com outros WS
WS no J2EE
Big WS x RESTFul
Usar JAX-RS quando
Desenvolvimento mais simples Acoplamento reduzido
Mais fácil o consumo (clientes)
Facilita manutenção (extensão da app) e escalabilidade Cliente pode consumir parte do serviço e combiná-lo
como outros serviços (mash-up)
Artigo
Pautasso, C. et al. RESTFul Web Services vs. Big Web
Services: Making the Right Architectural Decision. WWW ´08, pp. 805-814
WS no J2EE
Desenvolvendo com JAX-WS
Características
Complexidade do SOAP escondida via APIs do JAX-WS Lado servidor
Operações definidas por métodos em interface Java Implementação via classe(s) que implementam os
métodos da interface
Lado cliente
Cria um proxy
Objeto local que representa o serviço Chama métodos do proxy
WS no J2EE
Desenvolvendo com JAX-WS
Características
Portabilidade de Java
Independência de plataforma Interoperabilidade entre plataformas
Cliente JAX-WS pode acessar WS não Java Cliente não Java pode acessar serviço JAX-WS Óbvio ... (?)
Devido JAX-WS seguir padrões do W3C para WS
WS no J2EE
Desenvolvendo com JAX-WS
Porta do servidor
Diversos arquivos referenciam a porta do servidor Padrão é 8080
Pode ser alterada
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello Serviço
Classe Java anotada com @WebService Classe passa a ser um SEI
SEI
Service Endpoint Interface ou Service Endpoint
Implementation
A interface não é obrigatória Se interface
Indicada por argumento “endpointInterface” na
anotação @WebService
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello Serviço
Ferramenta (wsgen) gera todos os artefatos Em uso
Via o Enterprise Server (container) Passos
Codificação da classe Compilação da classe
Criação dos artefatos (wsgen)
Empacotamento em arquivo WAR
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello Servidor
Requisitos
Anotar classe ou interface (se houver) Métodos da classe devem ser
Públicos
Não static nem final Métodos do WS
Anotados com @WebMethod
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello Servidor Código package helloservice.endpoint; import javax.jws.WebService; @WebService
public class Hello {
private String message = new String("Hello, "); public void Hello() {}
@WebMethod
public String sayHello(String name) { return message + name + ".";
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello Servidor
Teste sem cliente
Após WS instalado (no container do J2EE)
Entrar com URL (local) do serviço mais função
de teste “?Tester”
Na página de teste (resposta) entrar com
argumentos (se for o caso) e clicar no método
Será mostrada a resposta do método
WS no J2EE
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello / Cliente
Instanciar a classe gerada
helloservice.endpoint.HelloService
Ela representa o serviço na URI indicada no arquivo
WSDL instalado
HelloService service = new HelloService();
Recuperar um proxy ao serviço
Também conhecido como “port”
Chamando o método getHelloPort do serviço
Hello port = service.getHelloPort();
WS no J2EE
WS no J2EE
Desenvolvendo com JAX-WS
Exemplo Hello / Cliente Código completo
O exemplo completo é um pouco mais complexo Mas o adicional não é exigido pelo JAX-WS
J2EE / RESTFul
RESTFul
RESTful WS
Serviços desenvolvidos para funcionar melhor na web
Melhor?
Escalabilidade Desempenho
Capacidade de modificação
REST
REpresentational State Transfer
Recurso
RESTFul
RESTful WS
Identificação por URI
Endereço global
Protocolo de comunicação sem estado
Por exemplo, HTTP
J2EE / RESTful
RESTful
Objetivos
Aplicações RESTful devem ser Simples
Leves
Alto desempenho
Interface (uniforme)
4 operações
PUT: cria um novo recurso
DELETE: recurso (criado) é excluído GET: recupera o estado de um recurso POST: atualiza o estado de um recurso
J2EE / RESTful
RESTful
Mensagens auto-descritas
Recursos são independentes da sua representação
Recursos podem ser acessados de diferentes formas como HTML, XML, texto, PDF, JPEG, JSON e outras
Metadados sobre o recurso usados para Controlar cache
Detectar erros de transmissão Negociar forma de representação Realizar autenticação
J2EE / RESTful
RESTful
Interações com estado
Cada interação com um recurso é sem estado Mensagens são auto-contidas
Interações com estado via conceito de “transferência explícita
de estado”
Via técnicas como Reescrita de URI Cookies
Campos escondidos de “form”
J2EE / RESTful
RESTful
Jersey implementação
Segue padrão JSR 311: JAX-RS Suporte a anotações
Documentação em:
https://jsr311.dev.java.net/nonav/javadoc/index.html A documentação teria que ser instalada (?) no Enterprise
J2EE/RESTful
RESTful
Classes de recurso raiz
Anotadas com @Path
Ou ao menos um método anotado com @Path
ou com designador de método de requisição @GET, @PUT, @POST ou @DELETE
Métodos de recursos
J2EE/RESTful
RESTFul
JAX-RS API
Java API para facilitar o desenvolvimento de aplicações com
RSET
Uso de anotações, específicas para HTTP
Anotações são resolvidas durante execução (runtime)
Uso de reflexão para gerar classes auxiliares e outros artefatos
para o recurso
Classes e artefatos agrupados em arquivo WAR (web) WAR deve ser instalado em container J2EE ou web
J2EE/RESTful
RESTful
Principais anotações
@Path
Caminho relativo de URI
Indica onde a classe Java será instalada
Pode ser adicionada com variáveis para definir modelos
(templates)
Exemplos
/helloWorld
Com controle de usuário/senha /helloWorld{username}
J2EE/RESTful
RESTful
Principais anotações
@GET
Métodos @GET devem processar requisições HTTP GET @POST
Métodos @POST devem processar requisições HTTP
POST @PUT Métodos @PUT ... @DELETE Métodos @DELETE ... @HEAD
J2EE/RESTful
RESTful
Principais anotações
@PathParam
Tipo de parâmetro que pode ser extraído para uso na
classe (em métodos por exemplo)
Extraído da URI requisitada
Nomes de parâmetros definidos na anotação @Path @QueryParam
Tipo de parâmetro que pode ser extraído para uso na
classe
J2EE/RESTful
RESTful
Principais anotações
@Consumes
Para especificar tipos MIME a serem consumidos pelo
recurso quando enviados pelo cliente
@Produces
Para especificar tipos MIME a serem produzidos pelo
recurso e enviados ao cliente
J2EE/RESTful
RESTful
Principais anotações
@Provider
Para especificar “qualquer objeto” (anything) de interesse
do ambiente de execução do JAX-RS; uma classe
Exemplos
MessageBodyReader
Usado para mapear itens da requisição HTTP em
parâmetros de métodos da classe recurso
MessageBodyWriter
Usado para mapear retornos de método (classe
recurso) em itens da resposta HTTP
ResponseBuilder
J2EE/RESTful
RESTful
Exemplo básico: Aplicação HelloWorld
Código recurso package com.sun.jersey.samples.helloworld.resources; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.Path;
// The Java class will be hosted at the URI // path "/helloworld"
@Path("/helloworld")
J2EE/RESTful
RESTful
Exemplo básico: Aplicação HelloWorld
Código recurso
// The Java method process HTTP GET requests
@GET
// The Java method produces content identified // by the MIME Media type “text/plain
@Produces("text/plain")
public String getClichedMessage() {
// Return some cliched textual content
return "Hello World"; }
// The Java method process POST requests
@POST
// … method saves the new hello contents
@Consumes("text/plain")
public void postClichedMessage(String message { // Store the message
} }
J2EE/RESTful
RESTful
Anotação @Path: mais detalhes
É um caminho parcial (como no exemplo HelloWorld) URI path templates
URI com variáveis resolvidas em tempo de execução Variáveis são anotadas com {}
Exemplo
@Path(“/users/{username}”} username é a variável
A URI de chamada do WS poderia ser (user Galileu):
J2EE/RESTful
RESTful
Anotação @Path: mais detalhes
@PathParam anotação
Usada para obter o valor de uma variável em um método Exemplo
@Path("/users/{username}") public class UserResource { @GET @Produces("text/xml")
public String getUser(@PathParam("username” String userName) {
... }
J2EE/RESTful
RESTful
Anotação @Path: mais detalhes
Restrições nos valores de uma variável Com uso de expressões regulares Exemplo
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}") Exige iniciar com letra seguida de zero ou mais alfas
ou underscore
A barra inicial (/) não é obrigatória Idem barra final
J2EE/RESTful
RESTful
Anotação @Path: variáveis
Anotadas com {} Exemplo
Recurso
@Path(“/{name1}/{name2}/”)
public class SomeResource {...}
Recurso deve responder a URI:
http://example.com/myContextRoot/jerseybeans/
{name1}/{name2}/
Instalar WAR em servidor Java EE que responde a: http://example.com/myContextRoot
J2EE/RESTful
RESTful
Anotação @Path: variáveis
Uma variável pode ser usada várias vezes Em conflito de caracteres: usar “%”+caracter
Exemplo
Valor de variável: “Rua%20da%20Praia”
J2EE/RESTful
RESTful
Respondendo a chamadas HTTP
Comportamento de um recurso é determinado pelos métodos
HTTP (GET, POST, PUT e DELETE)
Anotações de métodos
“Request Method Designator annotation” é Anotação dinâmica
Definida em JAX-RS
Corresponde a um método HTTP
JAX-RS define anotações para métodos comuns @GET, @POST, @PUT, @DELETE e @HED Usuário pode criar designadores customizados
J2EE/RESTful
RESTful
Respondendo a chamadas
Anotações de método HTTP
Métodos HTTP mapeados para método Java Comportamento do método depende da anotação Retornos possíveis
Void
Objeto Javax.ws.rs.core.Response
Múltiplos parâmetros podem ser recuperados com anotações Conversão entre tipos Java
J2EE/RESTful
RESTful
Respondendo a chamadas Exemplo Método PUT Serviço de “storage”J2EE/RESTful
RESTful
Respondendo a chamadas
Exemplo
@PUT
public Response putContainer() {
System.out.println("PUT CONTAINER " + container); URI uri = uriInfo.getAbsolutePath();
// cria objeto container
Container c = new Container(container, uri.toString()); Response r;
// cria resposta se Memory Store tem container if (!MemoryStore.MS.hasContainer(c)) {
r = Response.created(uri).build(); } else {
r = Response.noContent().build(); }
J2EE/RESTful
RESTful
Usando provedores de entidades
Entity providers
Provedores de entidades mapeiam representações de
argumentos e objetos Java
Dois tipos
MessageBodyReader MessageBodyWriter Message Body Reader
Usado para mapear corpo de requisições HTTP em
parâmetros de métodos
MessageBodyWriter
Usado para mapear valores de retorno (métodos) em
J2EE/RESTful
RESTful
Usando provedores de entidades
Tipos suportados automaticamente
Escrever um provedor somente se tipo fora da lista Lista:
byte[]: todos os tipos de m java.lang.String
java.io.InputStream Java.ioReader
Java.io.File
J2EE/RESTful
RESTFul
Usando provedores de entidades
Exemplo de anotação de MessageBodyReader
@Consumes("application/x-www-form-urlencoded")
@Provider
public class FormReader
implements MessageBodyReader<NameValuePair> {
Exemplo de anotação de MessageBodyWriter @Produces("text/html")
@Provider
public class FormWriter
implements MessageBodyWriter<Hashtable<String, String>> {
J2EE/RESTful
RESTful
Customizando requisições e respostas
Corpo de requisições e respostas HTPP são MIME
O tipo de MIME é especificado no header das mensagens
HTTP
Usuário pode especificar o tipo usado por um recurso via: Anotações @Produces para respostas
Anotações @Consumes para requisições Pelo padrão (default)
J2EE/RESTful
RESTful
Customizando requisições e respostas
@Produces
Se usada em nível de classe
Aplica-se a todos os métodos Se usada em nível de método
Sobrescreve anotações em nível de classe Exemplo de @Produces
J2EE/RESTful
RESTful
Customizando requisições e respostas
Exemplo de uso de @Produces (sem provider) @Path("/myResource")
@Produces("text/plain") // classe
public class SomeResource { @GET
public String doGetAsPlainText() { ...
}
@GET
@Produces(“text/html”) // método
public String doGetAsHtml() { ...
J2EE/RESTful
RESTful
Customizando requisições e respostas
@Consumes
Se usada em nível de classe
Aplica-se a todos os métodos Se usada em nível de método
Sobrescreve anotações em nível de classe Exemplo de @Consumes
J2EE/RESTful
RESTful
Customizando requisições e respostas
Exemplo de uso de @Consumes Observação: sem provider
@Path("/myResource")
@Consumes("multipart/related") //classe
public class SomeResource { @POST
public String doPost(MimeMultipart mimeMultipartData) {
... }
J2EE/RESTful
RESTful
Customizando requisições e respostas
Exemplo de uso de @Consumes (cont.)
@POST
// método
@Consumes("application/x-www-form-urlencoded") public String doPost2(FormURLEncodedProperties formData) {
... } }
J2EE/RESTful
RESTful
Extração de parâmetros de requisição
Parâmetros de métodos podem ser anotados para extração de
informação
Tipos de parâmetros que podem extraídos De “query”
Caminhos (path) de URIs De “form”
Cookies Headers Matrizes
J2EE/RESTful
RESTful
Extração de parâmetros de requisição tipo Query
Estão no corpo da requisição Exemplo
Parâmetro “step” é analizado; se não existe -> =2 @Path("smooth")
@GET
public Response smooth(
@DefaultValue("2") @QueryParam("step") int step, @DefaultValue("true") @QueryParam("min-m") boolean hasMin, @DefaultValue("true") @QueryParam("max-m") boolean hasMax, @DefaultValue("true") @QueryParam("last-m") boolean hasLast,
J2EE/RESTful
RESTful
Extração de parâmetros de requisição
Exemplo (cont.) @DefaultValue("blue") @QueryParam("min-color") ColorParam minColor, @DefaultValue("green") @QueryParam("max-color") ColorParam maxColor, @DefaultValue("red") @QueryParam("last-color") ColorParam lastColor ) { ... }
J2EE/RESTful
RESTful
Exemplo completo
Seção final do capítulo sobre REST no tutorial Java EE Inclui criação, geração, instalação e teste
J2EE/RESTful
Resumo
Protocolo HTTP
Serviço sem estado
Serviço é uma classe Java com anotações
Nome é uma URI
Métodos de atendimento são métodos HTTP
Métodos Java anotados
Parâmetros na URI de chamada
Parâmetros no corpo da consulta
Conversão padrão e customizada entre corpo da requisição e
J2EE/RESTful
RESTful
Considerações finais
Legibilidade?
Muito uso de anotação? Porque é mais leve?
(mais) simples? Que JAX-WS? Outras funcionalidades de WS?
Súmula parte WSDL
Conceitos de WSDL Introdução ao WSDL Estrutura de um arquivo WSDL Exemplo Vantagens/Desvantagens do WSDL
WSDL
Web Service Description Language
padrão para descrição de informações de serviços
pode ser usado como camada de descrição da arquitetura WS baseado em XML
arquivos WSDL são criados pelos desenvolvedores dos serviços
Web
cliente acessa as informações para usar os serviços
WSDL
motivação
Aplicações necessitam de uma série de informações para
poderem acessar um Web Service
Quais os serviços disponíveis;
Interface dos serviços;
Estrutura das mensagens utilizadas;
Protocolos de transporte;
Localização; Etc.
WSDL
conceitos gerais
documento WSDL
contém conjuntos de definições que descrevem os
Web Services
especifica as capacidades do serviço, sua localização
na Web e instruções a respeito de como acessá-los
define a estrutura da mensagem que um WS envia e
recebe
os dados que uma aplicação precisa fornecer a
WSDL
conceitos gerais
seleção
usando esta informação, as aplicações que estão
procurando por um WS para preencher uma
necessidade específica podem analisar os arquivos WSDL de inúmeros serviços e fazer a escolha
além disso, os arquivos WSDL fornecem informações
técnicas específicas
possibilitam às aplicações se conectarem e
comunicarem com os Web Services
WSDL descreve as
informações de um WS partindo de dados mais genéricos (alto nível) até as informações mais
Definition
Elemento mais externo; Namespaces utilizados;
Message
Dados enviados e recebidos pelas operações de um serviço; Suporte a tipos simples (inteiros, strings, booleanos);
Suporte a tipos complexos (estruturados, listas…)
PortType
Descreve de forma abstrata as operações disponíveis em um WS
Seu nome;
Um elemento do tipo “Message” para seus parâmetros de
entrada;
Um elemento do tipo “Message” para seus resultados;
Um elemento do tipo Message pode ser utilizado para descrever os
Binding
Define informações de mais baixo nível para as operações
definidas nos elementos PortType
Protocolo de Transporte (HTTP, FTP, …);
Protocolo de Mensagem (SOAP, XML-RPC, …);
Codificação da mensagem (rpc/encoded, document/literal,
…)
Recomendado: document/literal;
Comparação entre os diferentes estilos: http://
www-128.ibm.com/developerworks/webservices/ library/ws-whichwsdl/
Service
Associa cada elemento do tipo Binding a um endereço (endpoint)
utilizado para acessá-lo;
Um mesmo Binding pode estar associado a múltiplos elementos do
Web Service do Google
Disponível em:
http://www.google.com/apis/
Três operações
doGetCachedPage
Retorna uma página armazenada na cache do Google
dada sua URL;
doSpellingSuggestion
Verificação ortográfica de uma frase fornecida;
doGoogleSearch
Web Service do Google
Por simplificação, apenas os elementos relacionados à operação
Elementos do tipo Message
<message name="doSpellingSuggestion">
<part name="key" type="xsd:string"/> <part name="phrase" type="xsd:string"/> </message>
<message name="doSpellingSuggestionResponse">
<part name="return" type="xsd:string"/> </message> senha do Google frase a ser verificada resultado da verificação
Elemento PortType
<!-- Port for Google Web APIs, "GoogleSearch" --> <portType name="GoogleSearchPort"> <operation name="doSpellingSuggestion"> <input message="typens:doSpellingSuggestion"/> <output message="typens:doSpellingSuggestionResponse"/> </operation> </portType> nome da operação parâmetros resultados
Elemento Binding
<!-- Binding for Google Web APIs - RPC, SOAP over HTTP -->
<binding name="GoogleSearchBinding" type="typens:GoogleSearchPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="doSpellingSuggestion"> <soap:operation soapAction="urn:GoogleSearchAction"/> <input> <soap:body use="literal" namespace="urn:GoogleSearch" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="literal" namespace="urn:GoogleSearch" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> Estilo: document/literal SOAP sobre HTTP
Elemento Service
<!-- Endpoint for Google Web APIs --> <service name="GoogleSearchService">
<port name="GoogleSearchPort" binding="typens:GoogleSearchBinding"> <soap:address location="http://api.google.com/search/beta2"/>
</port> </service>
Vantagens
Automatização no processo de chamada de um WS; Interoperabilidade
diferentes aplicações em uma organização podem ser
integradas através de uma única interface;
Desvantagens
Redundância
Ex: nomes de operações e mensagens são repetidos
várias vezes nos diversos elementos de um arquivo WSDL;
Falta de informação semântica
WSDL apresenta apenas informação sintática dos
serviços;
Obstáculo para uma total automatização da interação
entre aplicações;
Semantic Annotations for WSDL Working Group: projeto
para criação de uma versão do WSDL com informações semânticas;
Súmula – parte UDDI
UDDI
Universal Description, Discovery, and Integration protocolo para publicação e procura dos serviços organizado em páginas amarelas, brancas e verdes
representa o nível de descoberta da pilha de protocolos de Web
UDDI
conceitos gerais: passos
1) tipos de anúncio do serviço Web
separa-se as funções que estão realmente sendo
executadas pelo desenvolvedor
separação é baseada na divisão de um serviço web
em
tipo do serviço Web
e uma ocorrência do serviço Web
como se poderia separar um objeto entre uma classe
UDDI
conceitos gerais: passos
o tipo de serviço deve transpor mais de uma
companhia para fomentar o seu reuso
explicitamente, quando dois serviços Web
compartilham a mesma definição de interface WSDL
o consumidor pode facilmente trocar de um para
outro
é um exemplo prático dos benefícos ganhos de se
UDDI
conceitos gerais: passos
2) anúncio do serviço Web
responsabilidade dos negócios e dos
desenvolvedores de software
anunciar os serviços Web de acordo com as
especificações anunciadas acima
os tipos de anúncios de serviços Web e suas
implementações são feitos usando o SOAP
segurança
integridade dos dados em trânsito estão
protegidos via uma conta UDDI e o uso do HTTPS.
UDDI
conceitos gerais: passos
3) registrador de negócios e identificadores de serviço
o negócio e os serviços são registrados
separadamente.
relacionamento muitos-para-um permite
que um negócio registre todos os serviços Web
que ele suporta debaixo da mesma entidade de negócio
UDDI
conceitos gerais: passos
4) pesquisa/pegunta a um Registro UDDI (Discovery)
os negócios são registrados separadamente dos
serviços que eles fornecem
o processo de pesquisa/pergunta (queryng) também
pode ser feito por negócios ou serviços
a API para pesquisa/pergunta ao registro UDDI
usa pacotes SOAP como um mecanismo
UDDI
conceitos gerais: passos
5) recuperação da descrição de um Serviço Web
a informação vinda de um registro é somente uma
parte
devido ao fato de que o UDDI é baseado num
modelo de diretório
conceito de diretório tem sido usado pela industria de
software
padrões para o compartilhamento de informações
sem que sejam repositórios de todas as informações X.500
bem conhecido LDAP (Lighwight directory
UDDI
conceitos gerais: passos
tipicamente, coisas como nome, uma pequena
descrição e o contato do negócio podem ser recuperados diretamente do UDDI
porém um documento WSDL descrevendo uma
interface com os serviços Web e um ponto final será recuperado em outros passos
UDDI
conceitos gerais: passos
6) WSDL query
a URL de um documento WSDL descrevendo os
serviços Web é retornada no passo anterior
normalmente, isto será a URL de um serviço Web
seguido por ?WSDL como no exemplo: http:// meuservidor/Services/QtdeEmEstoque?WSDL
UDDI
conceitos gerais: passos
7) recuperação WSDL
a WSDL requisitada no passo 6 é retornada usando
um protocolo de transporte como o HTTP
pode-se notar que os passos de 1 a 3 constituem o
processo de anúncio
o anúncio é modelado pela API de publicação
(publishing API)
os passos de 4 a 7 correspondem ao processo de
pesquisa/pergunta
WSDL
solução WSDL
um cliente pode consultar um serviço de lookup
também chamado registro de serviço
é um repositório que armazena as URLs dos documentos
WSDLs
registros armazenam arquivos que fornecem informações
técnicas específicas
usando esses dados, as aplicações podem acessar e
comunicar-se com os serviços Web
a aplicação cliente usa o WSDL, uma linguagem baseada
Outros protocolos Web Services
UDDI
Universal Description, Discovery, and Integration
protocolo para publicação e procura dos serviços
Revisão
O que são WS?
Quais os objetivos e vantagens? Características básicas?