Descobrindo APIs REST

697 views

Published on

O crescimento do mercado mobile e a necessidade de prover acesso a serviços existentes para desenvolvedores terceiros popularizaram o uso e disponibilização de APIs REST públicas. Com isso, pontos como escalabilidade, versionamento, desacoplamento e encapsulamento tornaram-se centrais no projeto de APIs. Nesta palestra será apresentado o conceito de APIs Hypermedia e como seu uso ajuda no projeto e implementação de APIs mais flexíveis.

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

No Downloads
Views
Total views
697
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
21
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Descobrindo APIs REST

  1. 1. Descobrindo 
 APIs REST
  2. 2. Guilherme Cavalcanti github.com/guiocavalcanti
  3. 3. Por quê?
  4. 4. 1º Definição Hermética
  5. 5. 2º apotonick/roar kevinswiber/siren jsonapi.org Como? Por quê? intridea/grape lostisland/sawyer caelum/restfulie
  6. 6. 3º What the f* is Representational State Transfer
  7. 7. “I am getting frustrated by the number of people calling any HTTP-based interface a REST API.” –Roy Fielding
  8. 8. Como?
  9. 9. • Problema conhecido por todos • Passo a passo para projetar e implementar uma API REST • Erros comuns, trade-offs e falácias
  10. 10. O que é rest e hypermedia?
  11. 11. • Estilo arquitetural • Restrições
  12. 12. O que é REST/Hypermedia? • Construção de sistemas distribuídos • Em 99% dos casos sistemas que funcionam na Web • Aplicativos mobile conversando com APIs • Aplicativos Web convesando com Aplicativos Web • Walledgarden
  13. 13. O processo 1. Entender o workflow que a API irá implementar 2. Construir máquina de estados 3. Construir media types 4. Implementar :)
  14. 14. Entender o workflow
  15. 15. Entender workflow • Pensar em termos de processos de negócio • Quantos e quais passos serão necessários?
  16. 16. Pagamento Pedido
  17. 17. O Problema • Ciclo de pedido • Ciclo de pagamento • Independentes • Comunicação assíncrona através de message queue • Maximiza throughput
  18. 18. Pagamento Pedido Message Queue
  19. 19. Simplificado • Na verdade são 3 ciclos independentes • Mais lucros • Dica: Starbucks Does Not Use Two-Phase Commit
  20. 20. Criar máquina de estados
  21. 21. Criar máquina de estados: cliente Pedir Sanduíche preparado Atualizar Pagar Pagamento realizado Pegar Sanduíche entregue
  22. 22. Caixa Escolher pedido Sanduíche Escolhido Lançar 
 pagamento Pagamento Lançado
  23. 23. Construir media type
  24. 24. ( o que é media type? )
  25. 25. “To some extent, people get REST wrong because I failed to include enough detail on media type design within my dissertation. That’s because I ran out of time […]” –Roy T. Fielding
  26. 26. Media types • É o que o cliente precisa saber para entender: • Comportamento (ou seja, quais transições saem de ume estado) • Semântica de alguns atributos da representação
  27. 27. Exemplo: text/html • Ao clicar no <a>: Requisição GET  para href • Ao submeter um <form>: Requisição method para action
  28. 28. Exemplo: text/html • O browser só precisa entender o media type. • Tanto faz se você está vendo o extrato da sua conta do banco ou um verbete na Wikipedia • media type = comportamento + semântica
  29. 29. Exemplo: APIs • Erros de validação • Internacionalização de mensagens • URLs
  30. 30. Media types • É por isso que sempre dizem que APIs REST não precisam de Documentação • Você só precisa descrever os media types utilizados • A semântica dos métodos HTTP já é bem definida • Utilizado nos cabeçalhos Accept e Content-­‐type
  31. 31. Voltando: Construir media type
  32. 32. Voltando: Construir media type
  33. 33. Sanduíche Variante Feito por terceiros application/vnd.subway.sanduiche-­‐v1+json Nome
  34. 34. Sanduíche: Semântica • id   • created_at   • pao   • queijo   • status   • updated_at
  35. 35. Pagamento: Semântica • id   • created_at   • numero_cartao   • expira_em   • valor
  36. 36. Semântica • Atributos que tem o mesmo significado para todos os recursos da API • Comportamentos inesperados (erros de validação)
  37. 37. Comportamento: Relacionamentos {      "links":  [          {  "rel":  "self",  "href":  "/pedidos/1"  },          {  "rel":  "pagamento",  "href":  "/pagamentos/pedidos/1"  }      ]   }
  38. 38. Comportamento: Relacionamentos • Representam as transições da nossa máquina de estados • Aumentam o desacoplamento • O cliente não precisa saber URLs a priori
  39. 39. Mas… Quais métodos utilizar?
  40. 40. “[…] methods are not given meaning by the media type. Instead, the media type tells the client either what method to use (e.g., anchor implies GET) or how to determine the method to use (e.g., form element says to look in method attribute). The client should already know what the methods mean (they are universal) and how to dereference a URI.” –Roy T. Fielding
  41. 41. HTTP Methods • GET • POST • PUT • PATCH • DELETE • OPTIONS
  42. 42. “ Rails is not restful “ Kind of comment…
  43. 43. Implementar
  44. 44. Pedir Sanduíche preparado Atualizar Pagar Pagamento realizado Pegar Sanduíche entregue
  45. 45. Fazer pedido: Requisição POST  /pedidos  HTTP/1.1   Accept:  application/vnd.subway.sanduiche-­‐v1+json
 
 {          "pao":  "3queijos",          "queijo":  "suíço",          "recheio":  "club"   }
  46. 46. Fazer pedido: Resposta HTTP/1.1  201  Created   Content-­‐type:  application/vnd.subway.sanduiche-­‐v1+json
 
 {      "id":  "1",      "created_at":  "2013-­‐10-­‐23T05:02Z",      "updated_at":  null,      "pao":  "3  queijos",      "queijo":  "suíço",      "recheio":  "club",      "status":  “em  preparo",      "links":  [          {  "rel":  "self",  "href":  "/pedidos/1"  },          {  "rel":  "pagamento",  "href":  "/pagamentos/pedidos/1"  }      ]   }
  47. 47. Atualizar pedido: Requisição PATCH  /pedidos/1  HTTP/1.1   Accept:  application/vnd.subway.sanduiche-­‐v1+json
 
 {          "queijo":  "cheddar"   }
  48. 48. Atualizar pedido: Resposta HTTP/1.1  200  Ok   Content-­‐type:  application/vnd.subway.sanduiche-­‐v1+json
 
 {      "id":  "1",      "created_at":  "2013-­‐10-­‐23T05:02Z",      "updated_at":  null,      "pao":  "3  queijos",      "queijo":  "cheddar",      "recheio":  "club",      "links":  [          {  "rel":  "self",  "href":  "/pedidos/1"  },          {  "rel":  "pagamento",  "href":  "/pagamentos/pedidos/1"  }      ]   }
  49. 49. Atualizar pedido: Erro HTTP/1.1  409  Conflict   Content-­‐type:  application/vnd.subway.sanduiche-­‐v1+json
 
 {      "id":  "1",      "created_at":  "2013-­‐10-­‐23T05:02Z",      "updated_at":  null,      "pao":  "3  queijos",      "queijo":  "suiço",      "recheio":  "club",      "links":  [          {  "rel":  "self",  "href":  "/pedidos/1"  },          {  "rel":  "pagamento",  "href":  "/pagamentos/pedidos/1"  }      ]   }
  50. 50. Como saber se é possível mudar o pedido? OPTIONS  /pedidos/1  HTTP/1.1 HTTP/1.1  200  Ok   Allow:  GET,  PATCH
  51. 51. Pagar pedido: REQUISIÇÃO • Lembra do media type? • Utilizar relacionamentos
  52. 52. Pagar pedido: REQUISIÇÃO GET  /pagamentos/pedidos/1  HTTP/1.1   Accept:  application/vnd.subway.sanduiches-­‐v1+json
 
 {          "numero_cartao":  "123312",          "expira_em":  "12/12",          "valor":  "12.45"   }
  53. 53. Ponto de vista do caixa: fila de sanduíches GET  /pedidos  HTTP/1.1   Accept:  application/vnd.subway.sanduiches-­‐v1+json
 {      "total":  12,      "page":  1,      "per_page":  10,      "items":  [          {  "id":  “1”,  “status”:  "pago"  …  },          {  "id":  “2”,  “status”,  “em  preparo"  …  }      ]   }
  54. 54. Listar pedido: media type • É necessário criar seu próprio media type? • Não! Já existem vários: • collection+json • atom+xml
  55. 55. Gems
  56. 56. roar beer  =  Beer.new(:title  =>  "Lonestar  Beer")   beer.post(order.links[:items])
  57. 57. jsonapi.org • Media type de propósito geral • Links, Coleções, etc
  58. 58. Obrigado :)
  59. 59. Referências • http://www.infoq.com/articles/webber-rest-workflow • http://www.enterpriseintegrationpatterns.com/ramblings/ 18_starbucks.html • http://roy.gbiv.com/untangled/2008/rest-apis-must-behypertext-driven • http://github.com/apotonick/roar • http://github.com/intridea/grape • http://jsonapi.org

×