• Nenhum resultado encontrado

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

  Twitter

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

Documentos relacionados