core rest edgarsilva_v1

42

Upload: edgar-silva

Post on 18-Dec-2014

371 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Core rest edgarsilva_v1
Page 2: Core rest edgarsilva_v1

Cloud, REST, Scripting Languages, JEE6 no

Google AppEngine

Edgar [email protected]

@jedgarsilva

Page 3: Core rest edgarsilva_v1

CoreRest (#corerest)

Page 4: Core rest edgarsilva_v1

Representational State Transfer

Page 5: Core rest edgarsilva_v1

Casos de Uso

• Simplificação de Serviços

•Web (somente Web)?

• Defina sua semantica de respostas (padrões XML, JSON, SEU)?

Page 6: Core rest edgarsilva_v1
Page 7: Core rest edgarsilva_v1
Page 8: Core rest edgarsilva_v1

Arquiteturas baseadas em REST

• Orientada de recursos (URIs)

• Orientado a Representações

• Sem Estado (HTTP)(*)• Hypermedia (Design)• (*) Gambis

Page 9: Core rest edgarsilva_v1

URI (Recursos)

• URL seus recursos de serviçoshttp://voos.com.br/saindo/GRU/SDU/amanha

– http://voos.com.br/chegando/agora– http://voos.com.br/status/voo/JJ1224

• “Steping Stones”/Linkability/Hypermedia

• QueryStrings: Famosos ?

Serviço de Consulta Voos: Saindo de Guarulhos, chegando em Stos Dummont

Page 10: Core rest edgarsilva_v1

REST

• Pense em simplicidade

• Não rodeie, por mais que você tente você não vai resolver tudo!

• Lembrese:• Simples != Medíocre

Page 11: Core rest edgarsilva_v1

4 Métodos para tudo resolve?

• Http– GET– POST– PUT– DELETE

Page 12: Core rest edgarsilva_v1

Não esqueça que você já fez mágica também ...

• SQL– Select, Insert, Delete, Update

• JMS– Send, Receive

• Windows– Reboot

Page 13: Core rest edgarsilva_v1

Design Rest

• Get – Leitura, idempotente, seguro

• Put – Escrita (insere/atualiza), idempontente

• Delete – Remover, idempontente

• Post – Não idempotente

Page 14: Core rest edgarsilva_v1

Orientado a Representação

• O Dado pode ter representações– O cliente e servidor podem “negociar” um

formato aceitável entre os dois.

Cliente“Eu gostaria”

Accept (MIME type) Accept-Language Accept-Encoding

Server“Pra você eu tenho”

Content-type header (MIME type)

Page 15: Core rest edgarsilva_v1

REST e Java

• Padrão JCP: JSR 311 - JAX-RS

• Parte do JEE6

• Implementações Padrões de Mercado– Jersey (Sun/Oracle)– RestEasy (JBoss/RedHat)

Page 16: Core rest edgarsilva_v1

REST em Java

@Path("/consulta") public class Consulta {

@GET @Path("/sessoes") public String getSessoes() { //logica }

http://servidor:8080/minhaapp/consultas/sessoes

}

Page 17: Core rest edgarsilva_v1

REST em Java

@GET @Path("/sessoes/{sessao}") public String getSessaoByID(@PathParam("sessao") String sessao) { // procura pela sessao }

@PUT @Path("/sessoes/{sessao}/reservar") public void addBook(@PathParam("sessao") String sessao, @QueryParam("email") String email) { //grava no banco uma reserva }

http://servidor:8080/minhaapp/evento/sessoes/819

.. minhaapp/fisl/sessoes/819/[email protected]

}

Page 18: Core rest edgarsilva_v1

Visibilidade de Parametros

• @QueryParam – Query string

• @HeaderParam – H T T P header

• @CookieParam – H T T P c o o k ie• @FormParam – Objetos de Forms

• @PathParam – Caminho U R I • @MatrixParam – Lista de URIs

Page 19: Core rest edgarsilva_v1

JBoss RestEasy

http://jboss.org/resteasy

Page 20: Core rest edgarsilva_v1

Expressões regulares nas URIs

@Path("/servico)public class MeuServico {   @GET   @Path("{var:.*}/algo")   public String get() {...}

GET /servico/algoGET /servico/antes/algoGET /servico/no/meio/de/algo

Page 21: Core rest edgarsilva_v1

Linkabilidade@Path("/")@Consumes({"application/xml", "application/json"})@Produces({"application/xml", "application/json"})public interface BookStore {

@AddLinks@LinkResource(value = Book.class)@GET@Path("books")public Collection<Book> getBooks();

<?xml version="1.0" encoding="UTF­8" standalone="yes"?><book xmlns:atom="http://www.w3.org/2005/Atom" title="foo" author="bar"> <atom:link href="http://localhost:8081/books" rel="list"/> <atom:link href="http://localhost:8081/books" rel="add"/> <atom:link href="http://localhost:8081/book/foo" rel="self"/> <atom:link href="http://localhost:8081/book/foo" rel="update"/> <atom:link href="http://localhost:8081/book/foo" rel="remove"/></book>

Page 22: Core rest edgarsilva_v1

Linkabilidade@Path("/")@Consumes({"application/xml", "application/json"})@Produces({"application/xml", "application/json"})public interface BookStore {

@AddLinks@LinkResource(value = Book.class)@GET@Path("books")public Collection<Book> getBooks();

{ "book": {  "@title":"foo",  "@author":"bar",  "atom.link":   [    {"@href":"http://localhost:8081/books","@rel":"list"},    {"@href":"http://localhost:8081/books","@rel":"add"},    {"@href":"http://localhost:8081/book/foo","@rel":"self"},    {"@href":"http://localhost:8081/book/foo","@rel":"update"},    {"@href":"http://localhost:8081/book/foo","@rel":"remove"}   ] }}

Page 23: Core rest edgarsilva_v1

REST Assincrono / COMETimport org.jboss.resteasy.annotations.Suspend;import org.jboss.resteasy.spi.AsynchronousResponse;

@Path("/")public class SimpleResource{

@GET @Path("basic") @Produces("text/plain") public void getBasic(final @Suspend(10000) AsynchronousResponse response) throws Exception { Thread t = new Thread() { @Override public void run() { try { Response jaxrs = Response.ok("basic").type(MediaType.TEXT_PLAIN).build(); response.setResponse(jaxrs); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); }}

Page 24: Core rest edgarsilva_v1

Api JavaScript

@Path("orders")public interface Orders { @Path("{id}") @GET public String getOrder(@PathParam("id") String id){ return "Hello "+id; }}

// JavaScript

var order = Orders.getOrder({id: 23});

// Uso do Objeto REST// Change the base URL used by the API:REST.apiURL = "http://api.service.com";

// log everything in a div elementREST.log = function(text){ jQuery("#log-div").append(text);};

Page 25: Core rest edgarsilva_v1

REST é um ótimo modelo de integração, quanto empregado de forma simples e

sem burocracia, melhor ainda.

Você ainda pode precisar de SOAP,WSDLs, ou seja: WS Tradicionais,

mas REST é uma ótima alternativa

Page 26: Core rest edgarsilva_v1

Clouds:Ambiente Elástico Computacional

Page 27: Core rest edgarsilva_v1

JBoss PaaS

Page 28: Core rest edgarsilva_v1

O Jeito que você programa hoje, pode ser o mesmo de amanha?

Page 29: Core rest edgarsilva_v1

Servidor Local

QA(Dev e Prod)

c

Servidores Produção

Page 30: Core rest edgarsilva_v1

ApacheWeb Server

+ Mod_Cluster

Page 31: Core rest edgarsilva_v1

Servidor Local

QA(Dev e Prod)

c

Servidores Produção

Red Hat PaaS

Servidor Cloud Servidor Cloud

Page 32: Core rest edgarsilva_v1

ApacheWeb Server

+ Mod_Cluster

Page 33: Core rest edgarsilva_v1

Serviço: http://corerest.appspot.comSources: http://github.com/edgars/corerest

Page 34: Core rest edgarsilva_v1

CoreRest

• Um serviço de middleware que roda no

Google AppEngine que permite a

criação e execução de Serviços

baseados em REST usando linguagens

dinâmicas dentro da JVM e ambiente

do Google.

Page 35: Core rest edgarsilva_v1

CoreRest

Yahoo Dados Públicos WebServicesTwitter Facebook

CoreRestServices

Web Android IPhone JavaFX

Page 36: Core rest edgarsilva_v1

Tecnologias

• JBoss RestEasy

• Java Server Faces 2.0

• PrettyFaces• Objectify

• Groovy• JRuby (Ruby)

• Java Script Engine

Page 37: Core rest edgarsilva_v1

Arquitetura

http://corerest.appspot.com/service/forecast/usa/90210CoreRest Endpoints Serviço URI

/usa/{zipcode}

1 Busca o Serviço pelo nome

2 Identifica a Linguagem do Script

3 Executa o Fonte do Script via Java Script Engine

4 Retorna o Processamento ao cliente

Page 38: Core rest edgarsilva_v1

Tá bom!

Me mostre código!

Hora do

DEMO

Page 39: Core rest edgarsilva_v1
Page 40: Core rest edgarsilva_v1

Acordem!

Hora da Demo!

Page 41: Core rest edgarsilva_v1

Serviço: http://corerest.appspot.comSources: http://github.com/edgars/corerest

Page 42: Core rest edgarsilva_v1

Edgar [email protected]