SlideShare a Scribd company logo
Core rest edgarsilva_v1
Cloud, REST, Scripting Languages,
             JEE6 no
        Google AppEngine

           Edgar Silva
        edgar@redhat.com


                           @jedgarsilva
CoreRest (#corerest)
Representational State Transfer
Casos de Uso

• Simplificação de Serviços

• Web (somente Web)?
• Defina suasemantica        de
  respostas (padrões XML, JSON, SEU)?
Core rest edgarsilva_v1
Core rest edgarsilva_v1
Arquiteturas baseadas em
                REST
•   Orientada de recursos (URIs)
•   Orientado a Representações
•   Sem Estado (HTTP)(*)
•   Hypermedia (Design)
•   (*) Gambis
URI (Recursos)

• URL seus recursos de serviços
     http://voos.com.br/saindo/GRU/SDU/amanha
  Serviço de Consulta Voos: Saindo de Guarulhos, chegando
                      em Stos Dummont

   – http://voos.com.br/chegando/agora
   – http://voos.com.br/status/voo/JJ1224
• “Steping Stones”/Linkability/Hypermedia
• QueryStrings: Famosos ?
REST

  • Pense em
    simplicidade
  • Não rodeie, por mais
    que você tente você
    não vai resolver tudo!
  • Lembrese:
  • Simples != Medíocre
4 Métodos para tudo resolve?

• Http
  – GET
  – POST
  – PUT
  – DELETE
Não esqueça que você já fez
     mágica também ...
• SQL
  – Select, Insert, Delete, Update
• JMS
  – Send, Receive
• Windows
  – Reboot
Design Rest
•   Get – Leitura, idempotente, seguro
•   Put – Escrita (insere/atualiza), idempontente
•   Delete – Remover, idempontente
•   Post – Não idempotente
Orientado a Representação

• O Dado pode ter representações
   – O cliente e servidor podem “negociar” um
     formato aceitável entre os dois.

     Cliente                         Server
   “Eu gostaria”                “Pra você eu tenho”
Accept (MIME type)             Content-type
 Accept-Language               header (MIME type)
 Accept-Encoding
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)
REST em Java
@Path("/consulta")

    public class Consulta {

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

         //logica
     }

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



}
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/reservar?email=edgar@redhat.com



}
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
•
JBoss RestEasy




      http://jboss.org/resteasy
Expressões regulares nas URIs
@Path("/servico)
public class MeuServico {
   
@GET
   @Path("{var:.*}/algo")
   public String get() {...}

GET /servico/algo
GET /servico/antes/algo
GET /servico/no/meio/de/algo
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>
Linkabilidade
@Path("/")
@Consumes({"application/xml", "application/json"})
@Produces({"application/xml", "application/json"})
public interface BookStore {

         @AddLinks
         @LinkResource(value = Book.class)
         @GET
{        @Path("books")
 "book": public Collection<Book> getBooks();
 {
  "@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"}
   ]
 }
}
REST Assincrono / COMET
import 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();
    }
}
Api JavaScript

@Path("orders")
public interface Orders {                     // JavaScript
 @Path("{id}")
 @GET                                         var order =
 public String                                Orders.getOrder({id: 23});
getOrder(@PathParam("id") String id){
  return "Hello "+id;
 }
}

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

                 // log everything in a div element
                 REST.log = function(text){
                  jQuery("#log-div").append(text);
                 };
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
Clouds:
Ambiente Elástico Computacional
JBoss PaaS
O Jeito que você programa hoje, pode ser
          o mesmo de amanha?
QA
                  (Dev e Prod)




                         c

Servidor Local

                 Servidores Produção
Apache
 Web Server
+ Mod_Cluster
QA
                                                    (Dev e Prod)


                    Red Hat PaaS
Servidor Local                                             c


                 Servidor Cloud   Servidor Cloud

                                                   Servidores Produção
Apache
 Web Server
+ Mod_Cluster
Serviço: http://corerest.appspot.com
Sources: http://github.com/edgars/corerest
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.
CoreRest

Yahoo   Dados Públicos    Twitter   Facebook WebServices



                   CoreRest
                   Services




        Web     Android    IPhone     JavaFX
Tecnologias

•   JBoss RestEasy
•   Java Server Faces 2.0
•   PrettyFaces
•   Objectify
•   Groovy
•   JRuby (Ruby)
•   Java Script Engine
Arquitetura
http://corerest.appspot.com/service/forecast/usa/90210
          CoreRest                  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
Tá bom!
Me mostre
código!

Hora do
DEMO
Core rest edgarsilva_v1
Acordem!

Hora da
Demo!
Serviço: http://corerest.appspot.com
Sources: http://github.com/edgars/corerest
Edgar Silva
edgar@redhat.com

More Related Content

PDF
No sql pour valtech tech days
ODP
JUDCon 2010 - Edgar Silva - Innovative ideas for Integration Solutions throu...
ODP
Jazoon2010 - Edgar Silva - Open source SOA on Steroids
ODP
JBoss5 @ FISL
PDF
Road Show 2008 Jon 2.0 Edgar
ODP
JUDCon 2010 - Innovative ideas for Integration Solutions through JBoss ESB
ODP
FISL11 - REST com Java - WebServices Simples e Ágeis
ODP
Soa meets clouds
No sql pour valtech tech days
JUDCon 2010 - Edgar Silva - Innovative ideas for Integration Solutions throu...
Jazoon2010 - Edgar Silva - Open source SOA on Steroids
JBoss5 @ FISL
Road Show 2008 Jon 2.0 Edgar
JUDCon 2010 - Innovative ideas for Integration Solutions through JBoss ESB
FISL11 - REST com Java - WebServices Simples e Ágeis
Soa meets clouds

Similar to Core rest edgarsilva_v1 (20)

PPTX
PPTX
Türsteher für Bohnen
PDF
Ria的强力后盾:rest+海量存储
ODP
Seminario Ruby On Rails Aula Open Source
PDF
DevInRio 2010 - NodeJS
PDF
FISL11 2010 - Automação de Datacenters
PDF
HTML5 WebSocket 발표 자료
PPT
Jetty Introduction
PDF
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
PPTX
Seguridad en Servicios Web
PPT
Lecture exch2k7 21_10_08 - copy
PDF
2011 01-18 mongo-db
PPTX
Aspetos gerais de desenvolvimento web.
PPTX
ADO.NET Entity Framework 4
PPT
Perl para sysadmins
PDF
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
PPT
BDD no mundo real
PPTX
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
PDF
Glass fishjavaee6directseminar
PDF
IIS7.5概要 10月17日
Türsteher für Bohnen
Ria的强力后盾:rest+海量存储
Seminario Ruby On Rails Aula Open Source
DevInRio 2010 - NodeJS
FISL11 2010 - Automação de Datacenters
HTML5 WebSocket 발표 자료
Jetty Introduction
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
Seguridad en Servicios Web
Lecture exch2k7 21_10_08 - copy
2011 01-18 mongo-db
Aspetos gerais de desenvolvimento web.
ADO.NET Entity Framework 4
Perl para sysadmins
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
BDD no mundo real
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Glass fishjavaee6directseminar
IIS7.5概要 10月17日
Ad

More from Edgar Silva (20)

PDF
API Methodology by Skalena
PDF
Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1
PDF
Skalena - Finance Business Unit
PDF
Plataforma de Consentimento (LGDP) Skalena
PDF
Casos de Sucesso WSO2 no Governo Brasileiro
PDF
DevOps Tour SP 2019
PDF
Skalena - Overview de Soluções
PDF
WSO2 Governance Registry 5.4.0 - Overview
PDF
WSO2 Enterprise Integrator 6.1 - Integração na Era da Transformação
PDF
Transformação Digital de Forma Pragmatica WSO2
PDF
WSO2 Novo Modelo de Subscrições e Produtos 2017
PDF
WSO2 API Manager 2.0 - Overview
PDF
Workshop WSO2 BPS 3.5.x - BPMN
PDF
WSO2 Telco MCX
PPTX
Workshop MSF4J - Getting Started with Microservices and Java
PDF
WSO2 API Manager : Going beyond the just API Management
PDF
Workshop/Tutorial WSO2 Micro Services Server
PDF
WSO2 Micro Services Server - Basic Workshop Part 1
PDF
Conectando Turismo e Viagens - Plataforma WSO2
PDF
WSO2 Application Server como Alternativa ao Tomcat
API Methodology by Skalena
Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1
Skalena - Finance Business Unit
Plataforma de Consentimento (LGDP) Skalena
Casos de Sucesso WSO2 no Governo Brasileiro
DevOps Tour SP 2019
Skalena - Overview de Soluções
WSO2 Governance Registry 5.4.0 - Overview
WSO2 Enterprise Integrator 6.1 - Integração na Era da Transformação
Transformação Digital de Forma Pragmatica WSO2
WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 API Manager 2.0 - Overview
Workshop WSO2 BPS 3.5.x - BPMN
WSO2 Telco MCX
Workshop MSF4J - Getting Started with Microservices and Java
WSO2 API Manager : Going beyond the just API Management
Workshop/Tutorial WSO2 Micro Services Server
WSO2 Micro Services Server - Basic Workshop Part 1
Conectando Turismo e Viagens - Plataforma WSO2
WSO2 Application Server como Alternativa ao Tomcat
Ad

Core rest edgarsilva_v1

  • 2. Cloud, REST, Scripting Languages, JEE6 no Google AppEngine Edgar Silva edgar@redhat.com @jedgarsilva
  • 5. Casos de Uso • Simplificação de Serviços • Web (somente Web)? • Defina suasemantica de respostas (padrões XML, JSON, SEU)?
  • 8. Arquiteturas baseadas em REST • Orientada de recursos (URIs) • Orientado a Representações • Sem Estado (HTTP)(*) • Hypermedia (Design) • (*) Gambis
  • 9. URI (Recursos) • URL seus recursos de serviços http://voos.com.br/saindo/GRU/SDU/amanha Serviço de Consulta Voos: Saindo de Guarulhos, chegando em Stos Dummont – http://voos.com.br/chegando/agora – http://voos.com.br/status/voo/JJ1224 • “Steping Stones”/Linkability/Hypermedia • QueryStrings: Famosos ?
  • 10. REST • Pense em simplicidade • Não rodeie, por mais que você tente você não vai resolver tudo! • Lembrese: • Simples != Medíocre
  • 11. 4 Métodos para tudo resolve? • Http – GET – POST – PUT – DELETE
  • 12. Não esqueça que você já fez mágica também ... • SQL – Select, Insert, Delete, Update • JMS – Send, Receive • Windows – Reboot
  • 13. Design Rest • Get – Leitura, idempotente, seguro • Put – Escrita (insere/atualiza), idempontente • Delete – Remover, idempontente • Post – Não idempotente
  • 14. Orientado a Representação • O Dado pode ter representações – O cliente e servidor podem “negociar” um formato aceitável entre os dois. Cliente Server “Eu gostaria” “Pra você eu tenho” Accept (MIME type) Content-type Accept-Language header (MIME type) Accept-Encoding
  • 15. 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)
  • 16. REST em Java @Path("/consulta") public class Consulta { @GET @Path("/sessoes") public String getSessoes() { //logica } http://servidor:8080/minhaapp/consultas/sessoes }
  • 17. 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/reservar?email=edgar@redhat.com }
  • 18. 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 •
  • 19. JBoss RestEasy http://jboss.org/resteasy
  • 20. Expressões regulares nas URIs @Path("/servico) public class MeuServico {     @GET    @Path("{var:.*}/algo")    public String get() {...} GET /servico/algo GET /servico/antes/algo GET /servico/no/meio/de/algo
  • 21. 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>
  • 22. Linkabilidade @Path("/") @Consumes({"application/xml", "application/json"}) @Produces({"application/xml", "application/json"}) public interface BookStore { @AddLinks @LinkResource(value = Book.class) @GET { @Path("books")  "book": public Collection<Book> getBooks();  {   "@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"}    ]  } }
  • 23. REST Assincrono / COMET import 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(); } }
  • 24. Api JavaScript @Path("orders") public interface Orders { // JavaScript @Path("{id}") @GET var order = public String Orders.getOrder({id: 23}); getOrder(@PathParam("id") String id){ return "Hello "+id; } } // Uso do Objeto REST // Change the base URL used by the API: REST.apiURL = "http://api.service.com"; // log everything in a div element REST.log = function(text){ jQuery("#log-div").append(text); };
  • 25. 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
  • 28. O Jeito que você programa hoje, pode ser o mesmo de amanha?
  • 29. QA (Dev e Prod) c Servidor Local Servidores Produção
  • 30. Apache Web Server + Mod_Cluster
  • 31. QA (Dev e Prod) Red Hat PaaS Servidor Local c Servidor Cloud Servidor Cloud Servidores Produção
  • 32. Apache Web Server + Mod_Cluster
  • 34. 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.
  • 35. CoreRest Yahoo Dados Públicos Twitter Facebook WebServices CoreRest Services Web Android IPhone JavaFX
  • 36. Tecnologias • JBoss RestEasy • Java Server Faces 2.0 • PrettyFaces • Objectify • Groovy • JRuby (Ruby) • Java Script Engine
  • 37. Arquitetura http://corerest.appspot.com/service/forecast/usa/90210 CoreRest 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