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"/>