Descobrindo APIs REST

61
Descobrindo APIs REST

description

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.

Transcript of Descobrindo APIs REST

Page 1: Descobrindo APIs REST

Descobrindo

APIs REST

Page 2: Descobrindo APIs REST

Guilherme Cavalcantigithub.com/guiocavalcanti

Page 3: Descobrindo APIs REST
Page 4: Descobrindo APIs REST

Por quê?

Page 5: Descobrindo APIs REST

Definição Hermética

Page 6: Descobrindo APIs REST

Como? Por quê?

intridea/grape

apotonick/roar

lostisland/sawyer

jsonapi.org

kevinswiber/siren

caelum/restfulie

Page 7: Descobrindo APIs REST

What the f* isRepresentational State Transfer

Page 8: Descobrindo APIs REST

–Roy Fielding

“I am getting frustrated by the number of people calling any HTTP-based interface a

REST API.”

Page 9: Descobrindo APIs REST
Page 10: Descobrindo APIs REST

Como?

Page 11: Descobrindo APIs REST

• Problema conhecido por todos

• Passo a passo para projetar e implementar uma API REST

• Erros comuns, trade-offs e falácias

Page 12: Descobrindo APIs REST

O que é rest e hypermedia?

Page 13: Descobrindo APIs REST

• Estilo arquitetural

• Restrições

Page 14: Descobrindo APIs REST

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

Page 15: Descobrindo APIs REST

O processo

1. Entender o workflow que a API irá implementar

2. Construir máquina de estados

3. Construir media types

4. Implementar :)

Page 16: Descobrindo APIs REST

Entender o workflow

Page 17: Descobrindo APIs REST

Entender workflow

• Pensar em termos de processos de negócio

• Quantos e quais passos serão necessários?

Page 18: Descobrindo APIs REST

PedidoPagamento

Page 19: Descobrindo APIs REST

O Problema

• Ciclo de pedido

• Ciclo de pagamento

• Independentes

• Comunicação assíncrona através de message queue

• Maximiza throughput

Page 20: Descobrindo APIs REST

PedidoPagamentoMessage Queue

Page 21: Descobrindo APIs REST

Simplificado

• Na verdade são 3 ciclos independentes

• Mais lucros

• Dica: Starbucks Does Not Use Two-Phase Commit

Page 22: Descobrindo APIs REST

Criar máquina de estados

Page 23: Descobrindo APIs REST

Criar máquina de estados: cliente

Sanduíche preparado

Pagamento realizado

Sanduíche entregue

Pedir Pagar Pegar

Atualizar

Page 24: Descobrindo APIs REST

Caixa

Sanduíche Escolhido

Pagamento Lançado

Escolher pedido

Lançar pagamento

Page 25: Descobrindo APIs REST

Construir media type

Page 26: Descobrindo APIs REST

( o que é media type? )

Page 27: Descobrindo APIs REST

–Roy T. Fielding

“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 […]”

Page 28: Descobrindo APIs REST

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

Page 29: Descobrindo APIs REST

Exemplo: text/html

• Ao clicar no <a>: Requisição GET  para href

• Ao submeter um <form>: Requisição method para action

Page 30: Descobrindo APIs REST

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

Page 31: Descobrindo APIs REST

Exemplo: APIs

• Erros de validação

• Internacionalização de mensagens

• URLs

Page 32: Descobrindo APIs REST

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

Page 33: Descobrindo APIs REST

Voltando: Construir media type

Page 34: Descobrindo APIs REST

Voltando: Construir media type

Page 35: Descobrindo APIs REST

application/vnd.subway.sanduiche-­‐v1+json

Feito por terceiros

Nome

Variante

Sanduíche

Page 36: Descobrindo APIs REST

Sanduíche: Semântica• id  

• created_at  

• pao  

• queijo  

• status  

• updated_at

Page 37: Descobrindo APIs REST

Pagamento: Semântica

• id  

• created_at  

• numero_cartao  

• expira_em  

• valor

Page 38: Descobrindo APIs REST

Semântica

• Atributos que tem o mesmo significado para todos os recursos da API

• Comportamentos inesperados (erros de validação)

Page 39: Descobrindo APIs REST

Comportamento: Relacionamentos

{      "links":  [          {  "rel":  "self",  "href":  "/pedidos/1"  },          {  "rel":  "pagamento",  "href":  "/pagamentos/pedidos/1"  }      ]  }

Page 40: Descobrindo APIs REST

Comportamento: Relacionamentos

• Representam as transições da nossa máquina de estados

• Aumentam o desacoplamento

• O cliente não precisa saber URLs a priori

Page 41: Descobrindo APIs REST

Mas… Quais métodos utilizar?

Page 42: Descobrindo APIs REST

–Roy T. Fielding

“[…] 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.”

Page 43: Descobrindo APIs REST

HTTP Methods• GET

• POST

• PUT

• PATCH

• DELETE

• OPTIONS

Page 44: Descobrindo APIs REST

“ Rails is not restful “ Kind of comment…

Page 45: Descobrindo APIs REST

Implementar

Page 46: Descobrindo APIs REST

Sanduíche preparado

Pagamento realizado

Sanduíche entregue

Pedir Pagar Pegar

Atualizar

Page 47: Descobrindo APIs REST

Fazer pedido: Requisição

POST  /pedidos  HTTP/1.1  Accept:  application/vnd.subway.sanduiche-­‐v1+json {          "pao":  "3queijos",          "queijo":  "suíço",          "recheio":  "club"  }

Page 48: Descobrindo APIs REST

Fazer pedido: RespostaHTTP/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"  }      ]  }

Page 49: Descobrindo APIs REST

Atualizar pedido: Requisição

PATCH  /pedidos/1  HTTP/1.1  Accept:  application/vnd.subway.sanduiche-­‐v1+json {          "queijo":  "cheddar"  }

Page 50: Descobrindo APIs REST

Atualizar pedido: RespostaHTTP/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"  }      ]  }

Page 51: Descobrindo APIs REST

Atualizar pedido: ErroHTTP/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"  }      ]  }

Page 52: Descobrindo APIs REST

Como saber se é possível mudar o pedido?

OPTIONS  /pedidos/1  HTTP/1.1

HTTP/1.1  200  Ok  Allow:  GET,  PATCH

Page 53: Descobrindo APIs REST

Pagar pedido: REQUISIÇÃO

• Lembra do media type?

• Utilizar relacionamentos

Page 54: Descobrindo APIs REST

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"  }

Page 55: Descobrindo APIs REST

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"  …  }      ]  }

Page 56: Descobrindo APIs REST

Listar pedido: media type

• É necessário criar seu próprio media type?

• Não! Já existem vários:

• collection+json

• atom+xml

Page 57: Descobrindo APIs REST

Gems

Page 58: Descobrindo APIs REST

roar

beer  =  Beer.new(:title  =>  "Lonestar  Beer")  beer.post(order.links[:items])

Page 59: Descobrindo APIs REST

jsonapi.org

• Media type de propósito geral

• Links, Coleções, etc

Page 60: Descobrindo APIs REST

Obrigado :)

Page 61: Descobrindo APIs REST

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-be-hypertext-driven

• http://github.com/apotonick/roar

• http://github.com/intridea/grape

• http://jsonapi.org