SlideShare una empresa de Scribd logo
1 de 68
Descargar para leer sin conexión
JAX-RS 2.0
As novidades do padrão para desenvolvimento REST
Fabio Velloso
Wednesday, September 18, 13
Fabio Velloso
• Bacharel em Ciência da Computação pela Universidade Federal
de São Carlos - UFSCar
• Fundador do SouJava
• Desenvolvendo projetos com tecnologia Java desde 96
• Professor de SOA e Web Services do curso de Pós-Graduação
"Lato-Sensu" em Desenvolvimento de Software para Web da
UFSCar
• Gerente de Arquitetura da Telefonica | VIVO
• Atualmente desenvolve projetos pessoais com Big Data, Cloud,
Design Thinking, Service Design e Economia Criativa
Wednesday, September 18, 13
Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
REST
• Estilo de arquitetura e suas restrições
• Recursos identificados unicamente por uma URI
• Interface uniforme (GET, POST, PUT, DELETE)
• Componentes REST manipulam recursos alterando sua
representação
• Mensagens auto-descritivas e sem estado ou “stateless”
• Informações podem estar em cache
• Multiplas representações
• Hypermedia
Wednesday, September 18, 13
Aplicação CRUD com REST
• Consultar o livro por seu ID
GET http://www.soujava.org.br/books/123
• Adicionar um livro
POST http://www.soujava.org.br/books
• Alterar um livro
PUT http://www.soujava.org.br/books
• Remover o livro pelo ID
DELETE http://www.soujava.org.br/books/123
Wednesday, September 18, 13
Aplicação CRUD com REST
Wednesday, September 18, 13
Aplicação CRUD com REST
<book>
<id>123</id>
<name>Java: The Good Parts </name>
<author>Jim Waldo</author>
<isbn>0596803737</isbn>
<isbn13>978-0596803735</isbn13>
</book>
Wednesday, September 18, 13
Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
• Suporte a RESTful em Java
• API padronizada
• Programação declarativa
• Anotações
• POJO
• Integrado ao JEE6 (JSR 313)
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Método HTTP
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Método HTTP
Serialização
Serialização
Wednesday, September 18, 13
Java API for RESTful Web Services - JSR 331
• @Path, @PathParam, @Produces, @Consumes
@HeaderParam, @QueryParam, @MatrixParam
@NewCookie
Recurso
Recurso
Método HTTP
Serialização
Serialização
Wednesday, September 18, 13
Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
JAX-RS 2.0 Java API for RESTful Web Services
• JSR 339
• Client API
• Validação
• Filters e Interceptors
• Processamento assíncrono
• Melhorias
• ResourceTemplate
• Link
JAX-RS 2.0JCP JAVA
EXTRA!!
Wednesday, September 18, 13
Client API
• Objetivos:
• Encapsular os conceitos e principais restrições da
arquitetura REST como artefatos Java em clientes
• Facilitar o consumo de RESTfull Web Services
• como JAX-RS facilitou desenvolvimento no servidor
• Compartilhar conceitos comuns entre client e server
JAX-RS
Wednesday, September 18, 13
Client API
• Padronização da API client
• Portável entre implementações
• Consumo de Web Services expostos sobre HTTP
• Pode acessar serviços REST construídos em outras
linguagens e frameworks
• ou acessar extensões como Web Dav
• Setar parâmetros e configurações
• Form, headers, SSL
Wednesday, September 18, 13
Client API
• Classes e interfaces mais importantes
• Client
• Usada para criar e acessar “web resources” e
configurar propriedades de conexões e requisições
• ClientBuilder.newClient();
• WebTarget
• encapsula um Web resource
• podendo criar e envia-lo requests e processar seus
responses
• .get() , .post() , .put() , .delete()
Wednesday, September 18, 13
Client API
• Client API com todos objetos
• Fluent API
Wednesday, September 18, 13
Client API
• Invocation
• Requisição preparada e pronta a ser executada
• Interface genérica (command) com clara separação de
conceitos:
• Creator - cria a requisição
• Submitter - envia a requisição
• Não precisa conhecer como o “Invocation” é
preparado e sim quando e como ele é executado
• Forma síncrona
• Forma assíncrona
Wednesday, September 18, 13
Client API
• Invocation
Invocation inv1 = client.target("http://examples.org/atm/balance")
.queryParam("card", "111122223333")
.queryParam("pin", "9876").request("text/plain").buildGet();
Invocation inv2 = client.target("http://examples.org/atm/withdrawal")
.queryParam("card", "111122223333").queryParam("pin", "9876")
.request().buildPost(text("50.0")));
Collection<Invocation> invs = Arrays.asList(inv1, inv2);
Collection<Response> ress =
Collections.transform(invs,
new F<Invocation, Response>() {
@Override
public Response apply(Invocation inv) {
return inv.invoke(); } });
Wednesday, September 18, 13
Client API
• Setar parâmetros do request
• “fluent” api
• Form
Wednesday, September 18, 13
Client API
• Setar parâmetros do request
• “fluent” api
• Form
Objeto JAXB
Wednesday, September 18, 13
Validation
• Verifica o conteúdo e formação de um ou mais campos
• Utiliza Beans Validation
• Suporte por anotações de validação em:
• Campos e propriedades
• Métodos (response entities)
• Resource classes
• Parâmetros (inclusive request entity)
• lança javax.validation.ValidationException
Wednesday, September 18, 13
Validation
• @NotNull
• Varifica se o campo é nulo
• se nulo javax.validation.ValidationException
Wednesday, September 18, 13
Validation
• @NotNull
• Varifica se o campo é nulo
• se nulo javax.validation.ValidationException
Wednesday, September 18, 13
Validation
• Aplicável a campos
@Path("/")
public class UserResource {
@NotNull
@FormParam("userName")
private String userName;
• Aplicável a métodos
@NotNull
@FormParam("userName")
public void setUserName(String userName) {
this.username = userName;
}
Wednesday, September 18, 13
Validation
• Aplicável a recursos
@Path("/createUser")
@PhoneRequired
public class CreateUserResource {
@FormParam("homePhone")
private Phone homePhone;
@FormParam("mobilePhone")
private Phone mobilePhone;
}
Wednesday, September 18, 13
Validation
• @Pattern com expressões regulares
• javax.validation.constraints.Pattern
• Erro - HTTP Status 400 - Bad Request
Wednesday, September 18, 13
Validation
• @Valid
• valida no método classes que tem “constraints”
public class Book {
private int id;
@NotNull
private String name; ...}
@POST
@Consumes(MediaType.APPLICATION_XML)
public void createBook(@Valid BookConstraints book) {
//Executa criacão }
• Erro na validação (ValidationException) retorna
• HTTP 400 ou HTTP 500
Wednesday, September 18, 13
Validation
• Custom Validation
• Validação definida pelo desenvolvedor
• Implementar a interface ConstraintValidator
Wednesday, September 18, 13
Filters
• Utilizados para modificar requests e responses
• Adicionar e/ou alterar headers
• Filtros podem ser server side e/ou client side
• ContainerRequestFilter
• ContainerResponseFilter
• ClientResponseFilter
• ClientRequestFilter
Wednesday, September 18, 13
ContainerResponseFilters
• Utilizado para modificar response
• alterando Headers
• Classe tem de implementar ContainerResponseFilter
• Filtros são aplicados globalmente em todos recursos da
aplicação por padrão
Wednesday, September 18, 13
ContainerResponseFilters
• Filtros por padrão são chamados de globais
• e aplicados a todos os recursos da aplicação
• Anotação @NameBinding
• Altera o comportamento padrão
• Especifica a quais recursos o filtro é aplicado
• Filtros com essa característica são chamados name-bound
Wednesday, September 18, 13
@NameBinding - passos
• Definir a Interface e anotação
• Definir e anotar a classe com @Provider e @<nome>
Wednesday, September 18, 13
@NameBinding - passos
• Anotar os recursos para o filtro
• Todos os flitros são executados como pos matching
• Executados após selecionar qual método deve ser acessado
para cada request
• Pode ser alterado usando a anotação @PreMatching
• são executados antes do iniciar o “matching”
Wednesday, September 18, 13
ContainerRequestFilters
• Similares aos ResponseFilters
• Possibilitam alteram os parâmetros do request
• Não possuem parâmetro ContainerResponseContext
• RequestFilters são executados como post-matching
• executados após o recurso a ser executado ser
“encontrado”
• GET, POST, PUT ou DELETE
• Pode-se alterar utilizando a anotação @PreMatching
• executa o filtro antes do “matching” do método
Wednesday, September 18, 13
ContainerRequestFilters
• @PreMatching
• Altera todos os métodos PUT para POST
• Assume que o código a ser executado é o mesmo
Wednesday, September 18, 13
Interceptors
• Manipular input/output streams
• Podem ser utilizados no cliente ou server
• Dois tipos de Interceptors
• ReaderInterceptors (manipulam stream de entrada)
• WriterInterceptors (manipulam streams de saída)
• Interceptors são globais (aplicados a todos os recursos)
• Anotação @NameBinding (name-bound)
• Especifica a quais recursos o filtro é aplicado
Wednesday, September 18, 13
Interceptors
Wednesday, September 18, 13
Asynchronous Processing
• Possibilita o processamento multithread no servidor,
aumentando o seu throughput
• Libera a thread do servidor para executar outras tarefas
• Processamento executa em outra thread ou espera em
uma fila até execução
• Quando recebe a resposta envia para o client
• @Suspended indica que o método será executado de
maneira assíncrona
• Possível setar timeout, portanto faça!
Wednesday, September 18, 13
Asynchronous Processing
Wednesday, September 18, 13
Asynchronous Processing
@Suspended
método assíncrono
Wednesday, September 18, 13
Asynchronous Processing
@Suspended
método assíncrono
Nova thread
Wednesday, September 18, 13
Asynchronous Processing
@Suspended
método assíncrono
Nova thread
retorna void
Wednesday, September 18, 13
Asynchronous Processing
@Suspended
método assíncrono
Nova thread
Executa na
nova thread
retorna void
Wednesday, September 18, 13
Asynchronous Processing
@Suspended
método assíncrono
Nova thread
Executa na
nova thread
retorna void
retorna o
resultado
Wednesday, September 18, 13
Asynchronous Processing - timeout
Wednesday, September 18, 13
Asynchronous Processing - timeout
Cria
TimeoutHandler
Wednesday, September 18, 13
Asynchronous Processing - timeout
Define
mensagem de
erro
Cria
TimeoutHandler
Wednesday, September 18, 13
Asynchronous Processing - timeout
Define
mensagem de
erro
Cria
TimeoutHandler
Lança uma
ServiceUnavailable
Exception
Mapeada em 503,
"Service
Unavailable" HTTP
error response
Wednesday, September 18, 13
Asynchronous Processing - timeout
Define timeout e
unidade
Define
mensagem de
erro
Cria
TimeoutHandler
Lança uma
ServiceUnavailable
Exception
Mapeada em 503,
"Service
Unavailable" HTTP
error response
Wednesday, September 18, 13
Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Wednesday, September 18, 13
Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Wednesday, September 18, 13
Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Representa o
resultado de
processamento
assíncrono
Wednesday, September 18, 13
Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Representa o
resultado de
processamento
assíncrono
Wednesday, September 18, 13
JAX-RS 2.0
• Novas funcionalidades para “build” de URIs
• Possibilida de uso de “templates” na classe UriBuilder
• método resolveTemplate()
• Resultado:
• http://www.thedevelopersconference.com.br/2013?
trilha=JavaEE
Wednesday, September 18, 13
JAX-RS 2.0
• Classe Link
• Implementa RFC 5988 (Web Link)
• Inserir metadados em mensagens HTTP
• Link é serializado em um HTTP Response como um header
HTTP
• Representa um link hypermedia
Wednesday, September 18, 13
Richardson Maturity Model
• Nível 0
• POX
• URI única
• Nível 1
• URIs, verbo único
• Nível 2
• CRUD
• URIs, verbos
• Nível 3
• Hypermedia
• RESTful Service POX
Recursos
Verbos HTTP
Controles
Hypermedia
Wednesday, September 18, 13
Hypermedia
• Links para declarar próximos passos
• Links para descrever transições de estado
• Navegação altera estado do recurso
• Máquina de estados e workflow
• XHTML, ATOM , JSON
Wednesday, September 18, 13
JAX-RS 2.0
• Link
• adicionando links a um objeto Response
• Consumindo em um cliente
Wednesday, September 18, 13
Link: <http://.../orders/1/review>;rel=review;op=POST
Link: <http://.../orders/1/cancel>;rel=cancel;op=POST
<order>
<id>1</id>
<customer>http://.../customers/21</customer>
<shippingAddress>http://.../customers/21/address/1<shippingAddress>
<orderItems>
<product>http://.../products/3345</product>
<quantity>1</quantity>
</orderItems>
<status>RECEIVED</status>
</order>
Hypermerdia
Reviewed
Canceled
Payed
Refunded
Received Shipped
Wednesday, September 18, 13
Wednesday, September 18, 13
OBRIGADO !!!!!
Wednesday, September 18, 13
OBRIGADO !!!!!
  fabio@soujava.org.br
@fabiovelloso
Wednesday, September 18, 13
OBRIGADO !!!!!
  fabio@soujava.org.br
@fabiovelloso
facebook.com/soujava
@soujava
soujava.org.br
Wednesday, September 18, 13

Más contenido relacionado

Similar a JAX-RS 2.0

Application Servers e Ruby
Application Servers e RubyApplication Servers e Ruby
Application Servers e RubyRafael Soares
 
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilImplementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilRenato Groff
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIElias Nogueira
 
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - Março
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - MarçoASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - Março
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - MarçoRenato Groff
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredElias Nogueira
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootRodrigo Cândido da Silva
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Rodrigo Peleias
 
Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Maurício Linhares
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosThiago Soares
 

Similar a JAX-RS 2.0 (20)

Application Servers e Ruby
Application Servers e RubyApplication Servers e Ruby
Application Servers e Ruby
 
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilImplementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
Curso AngularJS - Parte 2
Curso AngularJS - Parte 2Curso AngularJS - Parte 2
Curso AngularJS - Parte 2
 
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - Março
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - MarçoASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - Março
ASP.NET Core 3.1: Desenvolvimento de APIs Multiplataforma - Março
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
Aula 1 apresentação
Aula 1   apresentaçãoAula 1   apresentação
Aula 1 apresentação
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring Boot
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
 
Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãos
 

JAX-RS 2.0

  • 1. JAX-RS 2.0 As novidades do padrão para desenvolvimento REST Fabio Velloso Wednesday, September 18, 13
  • 2. Fabio Velloso • Bacharel em Ciência da Computação pela Universidade Federal de São Carlos - UFSCar • Fundador do SouJava • Desenvolvendo projetos com tecnologia Java desde 96 • Professor de SOA e Web Services do curso de Pós-Graduação "Lato-Sensu" em Desenvolvimento de Software para Web da UFSCar • Gerente de Arquitetura da Telefonica | VIVO • Atualmente desenvolve projetos pessoais com Big Data, Cloud, Design Thinking, Service Design e Economia Criativa Wednesday, September 18, 13
  • 3. Agenda • REST • Conceitos • JAX-RS • Conceitos e principais anotações • JAX-RS 2.0 • Novidades Wednesday, September 18, 13
  • 4. Agenda • REST • Conceitos • JAX-RS • Conceitos e principais anotações • JAX-RS 2.0 • Novidades Wednesday, September 18, 13
  • 5. REST • Estilo de arquitetura e suas restrições • Recursos identificados unicamente por uma URI • Interface uniforme (GET, POST, PUT, DELETE) • Componentes REST manipulam recursos alterando sua representação • Mensagens auto-descritivas e sem estado ou “stateless” • Informações podem estar em cache • Multiplas representações • Hypermedia Wednesday, September 18, 13
  • 6. Aplicação CRUD com REST • Consultar o livro por seu ID GET http://www.soujava.org.br/books/123 • Adicionar um livro POST http://www.soujava.org.br/books • Alterar um livro PUT http://www.soujava.org.br/books • Remover o livro pelo ID DELETE http://www.soujava.org.br/books/123 Wednesday, September 18, 13
  • 7. Aplicação CRUD com REST Wednesday, September 18, 13
  • 8. Aplicação CRUD com REST <book> <id>123</id> <name>Java: The Good Parts </name> <author>Jim Waldo</author> <isbn>0596803737</isbn> <isbn13>978-0596803735</isbn13> </book> Wednesday, September 18, 13
  • 9. Agenda • REST • Conceitos • JAX-RS • Conceitos e principais anotações • JAX-RS 2.0 • Novidades Wednesday, September 18, 13
  • 10. Java API for RESTful Web Services - JSR 331 • Suporte a RESTful em Java • API padronizada • Programação declarativa • Anotações • POJO • Integrado ao JEE6 (JSR 313) Wednesday, September 18, 13
  • 11. Java API for RESTful Web Services - JSR 331 Wednesday, September 18, 13
  • 12. Java API for RESTful Web Services - JSR 331 Recurso Recurso Wednesday, September 18, 13
  • 13. Java API for RESTful Web Services - JSR 331 Recurso Recurso Método HTTP Wednesday, September 18, 13
  • 14. Java API for RESTful Web Services - JSR 331 Recurso Recurso Método HTTP Serialização Serialização Wednesday, September 18, 13
  • 15. Java API for RESTful Web Services - JSR 331 • @Path, @PathParam, @Produces, @Consumes @HeaderParam, @QueryParam, @MatrixParam @NewCookie Recurso Recurso Método HTTP Serialização Serialização Wednesday, September 18, 13
  • 16. Agenda • REST • Conceitos • JAX-RS • Conceitos e principais anotações • JAX-RS 2.0 • Novidades Wednesday, September 18, 13
  • 17. JAX-RS 2.0 Java API for RESTful Web Services • JSR 339 • Client API • Validação • Filters e Interceptors • Processamento assíncrono • Melhorias • ResourceTemplate • Link JAX-RS 2.0JCP JAVA EXTRA!! Wednesday, September 18, 13
  • 18. Client API • Objetivos: • Encapsular os conceitos e principais restrições da arquitetura REST como artefatos Java em clientes • Facilitar o consumo de RESTfull Web Services • como JAX-RS facilitou desenvolvimento no servidor • Compartilhar conceitos comuns entre client e server JAX-RS Wednesday, September 18, 13
  • 19. Client API • Padronização da API client • Portável entre implementações • Consumo de Web Services expostos sobre HTTP • Pode acessar serviços REST construídos em outras linguagens e frameworks • ou acessar extensões como Web Dav • Setar parâmetros e configurações • Form, headers, SSL Wednesday, September 18, 13
  • 20. Client API • Classes e interfaces mais importantes • Client • Usada para criar e acessar “web resources” e configurar propriedades de conexões e requisições • ClientBuilder.newClient(); • WebTarget • encapsula um Web resource • podendo criar e envia-lo requests e processar seus responses • .get() , .post() , .put() , .delete() Wednesday, September 18, 13
  • 21. Client API • Client API com todos objetos • Fluent API Wednesday, September 18, 13
  • 22. Client API • Invocation • Requisição preparada e pronta a ser executada • Interface genérica (command) com clara separação de conceitos: • Creator - cria a requisição • Submitter - envia a requisição • Não precisa conhecer como o “Invocation” é preparado e sim quando e como ele é executado • Forma síncrona • Forma assíncrona Wednesday, September 18, 13
  • 23. Client API • Invocation Invocation inv1 = client.target("http://examples.org/atm/balance") .queryParam("card", "111122223333") .queryParam("pin", "9876").request("text/plain").buildGet(); Invocation inv2 = client.target("http://examples.org/atm/withdrawal") .queryParam("card", "111122223333").queryParam("pin", "9876") .request().buildPost(text("50.0"))); Collection<Invocation> invs = Arrays.asList(inv1, inv2); Collection<Response> ress = Collections.transform(invs, new F<Invocation, Response>() { @Override public Response apply(Invocation inv) { return inv.invoke(); } }); Wednesday, September 18, 13
  • 24. Client API • Setar parâmetros do request • “fluent” api • Form Wednesday, September 18, 13
  • 25. Client API • Setar parâmetros do request • “fluent” api • Form Objeto JAXB Wednesday, September 18, 13
  • 26. Validation • Verifica o conteúdo e formação de um ou mais campos • Utiliza Beans Validation • Suporte por anotações de validação em: • Campos e propriedades • Métodos (response entities) • Resource classes • Parâmetros (inclusive request entity) • lança javax.validation.ValidationException Wednesday, September 18, 13
  • 27. Validation • @NotNull • Varifica se o campo é nulo • se nulo javax.validation.ValidationException Wednesday, September 18, 13
  • 28. Validation • @NotNull • Varifica se o campo é nulo • se nulo javax.validation.ValidationException Wednesday, September 18, 13
  • 29. Validation • Aplicável a campos @Path("/") public class UserResource { @NotNull @FormParam("userName") private String userName; • Aplicável a métodos @NotNull @FormParam("userName") public void setUserName(String userName) { this.username = userName; } Wednesday, September 18, 13
  • 30. Validation • Aplicável a recursos @Path("/createUser") @PhoneRequired public class CreateUserResource { @FormParam("homePhone") private Phone homePhone; @FormParam("mobilePhone") private Phone mobilePhone; } Wednesday, September 18, 13
  • 31. Validation • @Pattern com expressões regulares • javax.validation.constraints.Pattern • Erro - HTTP Status 400 - Bad Request Wednesday, September 18, 13
  • 32. Validation • @Valid • valida no método classes que tem “constraints” public class Book { private int id; @NotNull private String name; ...} @POST @Consumes(MediaType.APPLICATION_XML) public void createBook(@Valid BookConstraints book) { //Executa criacão } • Erro na validação (ValidationException) retorna • HTTP 400 ou HTTP 500 Wednesday, September 18, 13
  • 33. Validation • Custom Validation • Validação definida pelo desenvolvedor • Implementar a interface ConstraintValidator Wednesday, September 18, 13
  • 34. Filters • Utilizados para modificar requests e responses • Adicionar e/ou alterar headers • Filtros podem ser server side e/ou client side • ContainerRequestFilter • ContainerResponseFilter • ClientResponseFilter • ClientRequestFilter Wednesday, September 18, 13
  • 35. ContainerResponseFilters • Utilizado para modificar response • alterando Headers • Classe tem de implementar ContainerResponseFilter • Filtros são aplicados globalmente em todos recursos da aplicação por padrão Wednesday, September 18, 13
  • 36. ContainerResponseFilters • Filtros por padrão são chamados de globais • e aplicados a todos os recursos da aplicação • Anotação @NameBinding • Altera o comportamento padrão • Especifica a quais recursos o filtro é aplicado • Filtros com essa característica são chamados name-bound Wednesday, September 18, 13
  • 37. @NameBinding - passos • Definir a Interface e anotação • Definir e anotar a classe com @Provider e @<nome> Wednesday, September 18, 13
  • 38. @NameBinding - passos • Anotar os recursos para o filtro • Todos os flitros são executados como pos matching • Executados após selecionar qual método deve ser acessado para cada request • Pode ser alterado usando a anotação @PreMatching • são executados antes do iniciar o “matching” Wednesday, September 18, 13
  • 39. ContainerRequestFilters • Similares aos ResponseFilters • Possibilitam alteram os parâmetros do request • Não possuem parâmetro ContainerResponseContext • RequestFilters são executados como post-matching • executados após o recurso a ser executado ser “encontrado” • GET, POST, PUT ou DELETE • Pode-se alterar utilizando a anotação @PreMatching • executa o filtro antes do “matching” do método Wednesday, September 18, 13
  • 40. ContainerRequestFilters • @PreMatching • Altera todos os métodos PUT para POST • Assume que o código a ser executado é o mesmo Wednesday, September 18, 13
  • 41. Interceptors • Manipular input/output streams • Podem ser utilizados no cliente ou server • Dois tipos de Interceptors • ReaderInterceptors (manipulam stream de entrada) • WriterInterceptors (manipulam streams de saída) • Interceptors são globais (aplicados a todos os recursos) • Anotação @NameBinding (name-bound) • Especifica a quais recursos o filtro é aplicado Wednesday, September 18, 13
  • 43. Asynchronous Processing • Possibilita o processamento multithread no servidor, aumentando o seu throughput • Libera a thread do servidor para executar outras tarefas • Processamento executa em outra thread ou espera em uma fila até execução • Quando recebe a resposta envia para o client • @Suspended indica que o método será executado de maneira assíncrona • Possível setar timeout, portanto faça! Wednesday, September 18, 13
  • 47. Asynchronous Processing @Suspended método assíncrono Nova thread retorna void Wednesday, September 18, 13
  • 48. Asynchronous Processing @Suspended método assíncrono Nova thread Executa na nova thread retorna void Wednesday, September 18, 13
  • 49. Asynchronous Processing @Suspended método assíncrono Nova thread Executa na nova thread retorna void retorna o resultado Wednesday, September 18, 13
  • 50. Asynchronous Processing - timeout Wednesday, September 18, 13
  • 51. Asynchronous Processing - timeout Cria TimeoutHandler Wednesday, September 18, 13
  • 52. Asynchronous Processing - timeout Define mensagem de erro Cria TimeoutHandler Wednesday, September 18, 13
  • 53. Asynchronous Processing - timeout Define mensagem de erro Cria TimeoutHandler Lança uma ServiceUnavailable Exception Mapeada em 503, "Service Unavailable" HTTP error response Wednesday, September 18, 13
  • 54. Asynchronous Processing - timeout Define timeout e unidade Define mensagem de erro Cria TimeoutHandler Lança uma ServiceUnavailable Exception Mapeada em 503, "Service Unavailable" HTTP error response Wednesday, September 18, 13
  • 55. Asynchronous Processing • Cliente assíncrono • Arquiteturas fracamente acopladas Wednesday, September 18, 13
  • 56. Asynchronous Processing • Cliente assíncrono • Arquiteturas fracamente acopladas Define a execução assíncrona Wednesday, September 18, 13
  • 57. Asynchronous Processing • Cliente assíncrono • Arquiteturas fracamente acopladas Define a execução assíncrona Representa o resultado de processamento assíncrono Wednesday, September 18, 13
  • 58. Asynchronous Processing • Cliente assíncrono • Arquiteturas fracamente acopladas Define a execução assíncrona Representa o resultado de processamento assíncrono Wednesday, September 18, 13
  • 59. JAX-RS 2.0 • Novas funcionalidades para “build” de URIs • Possibilida de uso de “templates” na classe UriBuilder • método resolveTemplate() • Resultado: • http://www.thedevelopersconference.com.br/2013? trilha=JavaEE Wednesday, September 18, 13
  • 60. JAX-RS 2.0 • Classe Link • Implementa RFC 5988 (Web Link) • Inserir metadados em mensagens HTTP • Link é serializado em um HTTP Response como um header HTTP • Representa um link hypermedia Wednesday, September 18, 13
  • 61. Richardson Maturity Model • Nível 0 • POX • URI única • Nível 1 • URIs, verbo único • Nível 2 • CRUD • URIs, verbos • Nível 3 • Hypermedia • RESTful Service POX Recursos Verbos HTTP Controles Hypermedia Wednesday, September 18, 13
  • 62. Hypermedia • Links para declarar próximos passos • Links para descrever transições de estado • Navegação altera estado do recurso • Máquina de estados e workflow • XHTML, ATOM , JSON Wednesday, September 18, 13
  • 63. JAX-RS 2.0 • Link • adicionando links a um objeto Response • Consumindo em um cliente Wednesday, September 18, 13