Rest Java One

1,175 views

Published on

por Eder Ignatowicz - Senior Architect na Dextra Sistemas

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,175
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
21
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Rest Java One

  1. 1. Then Jesus said, "Come to me, all of youwho are weary and carry heavy burdens, and I will give you REST." Matthew 11:28
  2. 2. JavaO ne LA 2012 TAM Approaching Pure REST in Java:HATEOAS and HTTP Tuning Eder Ignatowicz Senior Architect, Dextra
  3. 3. Software Craftsman @ Dextra (Arquitetura, NoSQL, Devops, QA) Doutorando na Unicamp (Polyglot Persistence em Cidades Digitais) Professor na Faccamp e Unisal Editor líder no InfoQ Brasil@ederign
  4. 4. Galera Ponta Firme e que Manda bem DextraProjetos Desafiadores Qualidade de Vida Ambiente de Melhoria Contínua
  5. 5. WE’R E Galera Ponta Firme e que Manda bem DextraProjetos Desafiadores HIRIN Qualidade de Vida G!!! Ambiente de Melhoria Contínua
  6. 6. O mundo, antes de REST
  7. 7. http://geekswithblogs.net/images/geekswithblogs_net/ugandadotnet/eai-spaghetti.jpg
  8. 8. TEMPOS DIFÍCEIS... MUITOS “PADRÕES” RMI, Corba, DCOM MUITOS FORNECEDORES Sun, Microsoft, OASIS, OMG MUITAS LÁGRIMASNão existia interoperabilidade Reinvenção da roda Vendor “lock-in”
  9. 9. SOAP WEB SERVICES
  10. 10. http://geekswithblogs.net/images/geekswithblogs_net/ugandadotnet/eai-spaghetti.jpg
  11. 11. http://geekswithblogs.net/images/geekswithblogs_net/ugandadotnet/eai-spaghetti.jpg
  12. 12. Então surgiu o REST!!!
  13. 13. RESTRoy Fielding Dissertation REpresentational State Transfer ESTILO DE ARQUITETURA DE SOFTWARE PARA SISTEMAS DISTRIBUÍDOS HYPERMEDIA SEMELHANTES A WORLD WIDE WEB
  14. 14. PRINCÍPIOS E RESTRIÇÕES REST CLIENTE-SERVIDOR SERVIDOR STATELESS CACHE INTERFACE UNIFORME IDENTIFICAÇÃO DE RECURSOSMANIPULAÇÃO DESTES RECURSOS ATRAVÉS DE REPRESENTAÇÕES MENSAGENS AUTO-DESCRITIVAS HYPERMEDIA COMO ENGINE DO ESTADO DA APLICAÇÃO ARQUITETURA EM CAMADAS CÓDIGO SOB DEMANDA (OPCIONAL)
  15. 15. HTTP tunningCACHE HATEOAS
  16. 16. GET Buscar recursos, cachePOST Criar um novo recurso PUT Atualizar (todo o) recurso existenteDELETE Remover um recursoPATCH Atualizar (parte de) um recurso
  17. 17. NÃO RESTful VERBO URI (Substantivo) Ação POST /bookmarks/create Criar GET /bookmarks/show/1 Visualizar POST /bookmarks/update/1 AlterarGET/POST /bookmarks/delete/1 Apagar RESTful VERBO URI (Substantivo) Ação POST /bookmarks/ Criar GET /bookmarks/1 Visualizar PUT /bookmarks/1 Alterar DELETE /bookmarks/1 Apagar
  18. 18. TOLERÂNCIA A FALHASNOSSOS SONHOS NA INTESEGURANÇA SISTE GRAÇÃO MAS DE ESCALABILIDADE BAIXO ACOPLAMENTO
  19. 19. Mas extremamentemal compreendida...
  20. 20. ““O que precisa ser feito para que entendam que no estilo arquitetural REST o hypertext é um pré-requisito? Em outras palavras, se a engine do estado da aplicação (e consequentemente sua API) não é guiada por hypertext, então sua aplicação nãopode ser RESTful e nem ter uma API REST. PONTO. Existe por ai algum manual que necessite ser consertado?” Roy Thomas Fielding
  21. 21. HYPERMEDIA
  22. 22. Richardson’s Maturity Model REST Sagrado Nível 3: Controles Hypermedia Nível 2: Verbos HTTP Nível1: RecursosNível 0: O pântano do POX
  23. 23. Nível 0: O pântano do POX Uma URI, um método HTTP XML-RPC / SOAP / POX HTTP usado como transportePOST /agendamentoService HTTP/1.1[headers...]<appointmentRequest> <slot doctor = "rcmito" start = "1400" end = "1450"/> <patient id = "ederi"/></appointmentRequest>
  24. 24. Nível 1: Recursos Cada recurso tem uma única URI URI tunnelingUm único verbo HTTP (POST ou GET) HTTP usado como transportePOST /slots/1234 HTTP/1.1[headers...]<appointmentRequest> <patient id = "ederi" /></appointmentRequest>
  25. 25. Level 2: HTTP Verbs Muitas URIs, utilizando corretamente os verbos HTTP Uso correto dos códigos de resposta Expõe estado e não comportamento CRUDGET /doctors/rcmito/slots?date=20121010?status=openHTTP/1.1[headers...]HTTP/1.1 200 OK<openSlotList> <slot id = “1234” start=”1400” end=”1450” /> <slot id = “1234” start=”1600” end=”1650”/></openSlotList>
  26. 26. Níveis 0,1 e 2não são RESTful (e nem REST)
  27. 27. Nível 3: Controles Hypermedia Hypermedia As The Engine of Application State (HATEOAS) Recursos auto descritivosClientes só precisam saber a URI root (home page) de uma API e os media types utilizados O resto é HTTP e links
  28. 28. “ O nome Representational State Transfer foiescolhido com a intenção de criar uma imagem de como uma aplicação Web bem desenvolvida secomporta: uma rede de páginas web (máquina de estados), onde o usuário navega selecionando links (transições de estados), resultando na próxima página (próximo estado da aplicação). Roy Thomas Fielding
  29. 29. ESTADO ESTADO http://uri Transição Transição ESTADO Transição TransiçãoESTADO ESTADO
  30. 30. HTTP/1.1 201 CreatedLocation: http://jogano10.com/slots/1234/appointment[various headers]<appointment> <slot id = "1234" doctor = "rcmito" start = "1400"end = "1450"/> <patient id = "ederi"/> <link rel = "/linkrels/appointment/cancel" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/addTest" uri = "/slots/1234/appointment/tests"/> <link rel = "self" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/updateContactInfo" uri = "/patients/ederi/contactInfo"/></appointment>
  31. 31. Isto éRESTFUL
  32. 32. As três grandesinvenções da nossa história são:
  33. 33. HYPERLINK !!!
  34. 34. JAX-RS API
  35. 35. JAX-RS API Recursos @Path("/cartao/{cardId}") public class Cartao { Injeção dos @GET @Path("/saldo") parâmetros @Produces("text/plain") public Saldo saldo(@PathParam("cardId") String card) { return getSaldo(card); } ... }HTTP Method Binding Serialização automática
  36. 36. JAX-RS API SUPORTE A HATEOAS
  37. 37. Hypermedia Suporte a HATEOAS// Server APIResponse res = Response.ok(order) .link("http://.../orders/1/ship", "ship") .build();// Client APIResponse order = client.target(…) .request("application/xml").get();if (order.getLink(“ship”) != null) { Response shippedOrder = client .target(order.getLink("ship")) .request("application/xml").post(null); }
  38. 38. REST sem HATEOAS não é REST
  39. 39. Não devem existirverbos na sua URI
  40. 40. Mas, eu preciso mais do que a semântica GET/POST/PUT DELETE/PATCH "But my model is different!". You are not a special or unique snowflake. - should I build another protocol? - should I add a new HTTP method? - answer 1: tough shit. youre wrong, it can be modeled with the uniform interface, its sufficiently general.
  41. 41. Concorrência? If you do two PUTs at once, one wins. The solution depends on what you need. For a lot of applications, "last update wins" is a fine strategy. If not, Etags are the solution.
  42. 42. Transações... ?!? I want to debit one guys account at the same time, and only if, I can credit another guys account. I could do two PUTs in a row, but thats begging for inconsistencies to creep into the system. answer 1: YAGNI. Answer 2: what you probably want is a new resource to encapsulate
  43. 43. Não existe a necessidade de API nem deversionamento de APIs!!! - So Iʼll wrap up where we started. Youʼll find that the closer you move to REST, the less of a distinct API youʼll have at all. The “regular” application and its API will become one. - The rub, and itʼs a big rub, is not a technical one but a social one. Building on a API requires trust of stability, and “traditional” websites donʼt provide for
  44. 44. Escalabilidade HTTP + JAX-RS http://2.bp.blogspot.com/-JmDsZ1ESAWg/TyiHY8MMdzI/AAAAAAAAEDs/lFZxR0z5fGk/s1600/escalada1.jpg
  45. 45. HTTP Caching Reverse Web Server Translation Proxy ProxyLocal Cache “The Proxies”
  46. 46. HTTP allowed (or not) expirationintermediary caches Caching features allowed (or not) validation storable(or not)
  47. 47. HTTP Quando “cachear”? Expires header Expires: Sun, 04 Aug 2012 16:00 GMT Cache-control header Cache-Control: no-cacheCache-Control: public, max-age=3000 Validation Header Last-Modified: Mon, 29 Jun 2012 02:28:12 GMT ETag: "3e86-410-3596fbbc"
  48. 48. JAX-RS e Cache Control@Path("/doutores")public class DoutoresService { @Path("/{id}") @GET @Produces("application/xml") public Response getDoutores(@PathParam("id") int id) { List<Doutor> doutores = //getDoutores CacheControl cc = new CacheControl(); cc.setMaxAge(3000); return Response.ok(doutores).cacheControl(cc).build(); }}
  49. 49. JAX-RS e Gets CondicionaisLast-Modified: Mon, 29 Jun 2012 02:28:12 GMT ETag: "3e86-410-3596fbbc" O cache está valido? 304 “Not Modified” Não está? 200 “OK” + recurso válido
  50. 50. @Path("/doutores")public class DoutoresService { @Path("/{id}") @GET @Produces("application/xml") public Response getDoutores(@PathParam("id") int id, @Context Request request) { EntityTag tag = // get tag mais atualizada ResponseBuilder builder = null; builder = request.evaluatePreconditions(tag); if (builder != null){ return builder.cacheControl(cc).build(); } Object doutores = // getDoutores return Response.ok(doutores).cacheControl(cc).build(); }}
  51. 51. JAX-RS e Cache-Control@Path("/doutores") O mesmo princípio se aplicapublic class DoutoresService { @Path("/{id}") @GET para PUTs e POSTs @Produces("application/xml") public Response getDoutores(@PathParam("id") int id) { condicionais List<Doutor> doutores = //getDoutores CacheControl cc = new CacheControl(); cc.setMaxAge(3000); }} (updates concorrentes) return Response.ok(doutores).cacheControl(cc).build();
  52. 52. JSR 339: JAX-RS 2.0Public Review Ballot 24/11/2012 Adopt a JSR
  53. 53. Client API @Before public void setUp() throws Exception { // start the server server = Main.startServer(); // create the client Client c = ClientFactory.newClient(); target = c.target(Main.BASE_URI); } @After public void tearDown() throws Exception { server.stop(); } @Test public void testExtratoSemHATEOAS() { String responseMsg = target.path("cartao/1/saldo").request() .get(String.class); assertEquals(value, responseMsg); }
  54. 54. Interceptors/Handlers Pontos de extensão: Logging, Compression, Security, etc.@Providerclass LoggingFilter implements RequestFilter, ResponseFilter { @Override public FilterAction preFilter(FilterContext ctx) throws IOException { logRequest(ctx.getRequest()); return FilterAction.NEXT; } @Override public FilterAction postFilter(FilterContext ctx) throws IOException { logResponse(ctx.getResponse()); return FilterAction.NEXT; }
  55. 55. Async Suporte na API Client// Acesso URITarget target = client.target("http://.../atm/balance")…// Chamada async e callbackFuture<?> handle = target.request().async().get( new InvocationCallback<String>() { public void complete(String balance) { … } public void failed(InvocationException e) { … } });
  56. 56. Java <3
  57. 57. @ederign

×