core rest edgarsilva_v1
DESCRIPTION
TRANSCRIPT
CoreRest (#corerest)
Representational State Transfer
Casos de Uso
• Simplificação de Serviços
•Web (somente Web)?
• Defina sua semantica de respostas (padrões XML, JSON, SEU)?
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ç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
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“Eu gostaria”
Accept (MIME type) Accept-Language Accept-Encoding
Server“Pra você eu tenho”
Content-type header (MIME type)
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/[email protected]
}
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/algoGET /servico/antes/algoGET /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="UTF8" 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")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"} ] }}
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(); }}
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);};
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?
Servidor Local
QA(Dev e Prod)
c
Servidores Produção
ApacheWeb Server
+ Mod_Cluster
Servidor Local
QA(Dev e Prod)
c
Servidores Produção
Red Hat PaaS
Servidor Cloud Servidor Cloud
ApacheWeb Server
+ Mod_Cluster
Serviço: http://corerest.appspot.comSources: 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 WebServicesTwitter Facebook
CoreRestServices
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/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
Tá bom!
Me mostre código!
Hora do
DEMO
Acordem!
Hora da Demo!
Serviço: http://corerest.appspot.comSources: http://github.com/edgars/corerest
Edgar [email protected]